Added option for Manual Revaluation of Currency Accounts
[fa-stable.git] / gl / includes / db / gl_db_banking.inc
index afc9e516ccdad66570c4dd028863e230eb8e9353..58825018e3e12db6fb01beaac3bb9aa4aec86079 100644 (file)
@@ -9,55 +9,70 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
 ***********************************************************************/
-function add_exchange_variation($trans_type, $trans_no, $date_, $acc_id, $account,
+function add_exchange_variation($trans_no, $date_, $acc_id, $account,
     $currency, $person_type_id=null, $person_id = "")
 {
        if (is_company_currency($currency))
-               return;
+               return false;
        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=".db_escape($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()));
-*/
-       $result = db_query("SELECT SUM(bt.amount) AS foreign_amount, SUM(gt.amount) AS amount           
-               FROM ".TB_PREF."bank_trans bt,  ".TB_PREF."gl_trans gt, ".TB_PREF."bank_accounts ba
-               WHERE bt.bank_act=".db_escape($acc_id)." AND bt.trans_date<='".date2sql($date_)."'
-               AND ((bt.amount > 0 AND gt.amount > 0) OR (bt.amount <= 0 AND gt.amount <= 0)) 
-               AND bt.type = gt.type AND bt.trans_no = gt.type_no 
-               AND ba.id = bt.bank_act AND ba.account_code = gt.account",
-               "Transactions for account $account could not be calculated");
-       $row = db_fetch($result);
-       $diff = $row['amount'] - (round2($row['foreign_amount'] * $rate, user_price_dec()));
+       $diff = $amount - $for_amount;
        if ($diff != 0)
        {
-               if ($trans_type == null)
-                       $trans_type = ST_JOURNAL;
                if ($trans_no == null)
-                       $trans_no = get_next_trans_no($trans_type);
+                       $trans_no = get_next_trans_no(ST_JOURNAL);
                if ($person_type_id == null)
                        $person_type_id = PT_MISC;
-               add_gl_trans($trans_type, $trans_no, $date_, $account, 0, 0, _("Exchange Variance"),
+               add_gl_trans(ST_JOURNAL, $trans_no, $date_, $account, 0, 0, _("Exchange Variance"),
                -$diff, null, $person_type_id, $person_id);
-       add_gl_trans($trans_type, $trans_no, $date_, get_company_pref('exchange_diff_act'), 0, 0, 
+       add_gl_trans(ST_JOURNAL, $trans_no, $date_, get_company_pref('exchange_diff_act'), 0, 0, 
                _("Exchange Variance"), $diff, null, $person_type_id, $person_id);
-       }       
+       }
+       return ($diff != 0);
 }
 
-function add_exchange_variation_all()
+function add_exchange_variation_all($date=null, $ref="", $memo)
 {
+       global $Refs;
+       begin_transaction();
+       $exchanged = false;
        $trans_no = get_next_trans_no(ST_JOURNAL);
        $sql = "SELECT * FROM ".TB_PREF."bank_accounts";
        $result = db_query($sql, "could not retreive bank accounts");
        while ($myrow = db_fetch($result))
-               add_exchange_variation(ST_JOURNAL, $trans_no, null, $myrow['id'], $myrow['account_code'],
-                       $myrow['currency_code']);
+       {
+               if (add_exchange_variation($trans_no, $date, $myrow['id'], $myrow['account_code'],
+                       $myrow['bank_curr_code']))
+                       $exchanged = true;
+       }
+       if ($exchanged)
+       {
+               add_comments(ST_JOURNAL, $trans_no, $date, $memo);
+               if ($ref == "")
+                       $ref = $Refs->get_next(ST_JOURNAL);
+               $Refs->save(ST_JOURNAL, $trans_no, $ref);
+               add_audit_trail(ST_JOURNAL, $trans_no, $date);
+       }       
+       commit_transaction();
+       return ($exchanged ? $trans_no : 0);
 }
 //----------------------------------------------------------------------------------
 //     Add bank tranfer to database.
@@ -69,7 +84,7 @@ function add_exchange_variation_all()
 function add_bank_transfer($from_account, $to_account, $date_,
        $amount, $ref, $memo_, $charge=0)
 {
-       global $Refs;
+       global $Refs, $SysPrefs;
        
        begin_transaction();
 
@@ -81,7 +96,8 @@ function add_bank_transfer($from_account, $to_account, $date_,
 
        $from_gl_account = get_bank_gl_account($from_account);
        $to_gl_account = get_bank_gl_account($to_account);
-
+       
+       $exchanged = false;
        $total = 0;
        // do the source account postings
     $total += add_gl_trans($trans_type, $trans_no, $date_, $from_gl_account, 0, 0, "",
@@ -91,10 +107,12 @@ function add_bank_transfer($from_account, $to_account, $date_,
                $date_, -($amount + $charge),
                PT_MISC, "", $currency,
                "Cannot insert a source bank transaction");
-
-       add_exchange_variation($trans_type, $trans_no, $date_, $from_account, $from_gl_account, 
-               $currency, PT_MISC, "");
-
+       if ($SysPrefs->auto_currency_revaluation())
+       {
+               $trans_no1 = get_next_trans_no(ST_JOURNAL);
+               if (add_exchange_variation($trans_no1, $date_, $from_account, $from_gl_account, $currency))
+                       $exchanged = true;
+       }
        if ($charge != 0)
        {
                /* Now Debit bank charge account with charges */
@@ -113,11 +131,17 @@ function add_bank_transfer($from_account, $to_account, $date_,
                $date_, $amount, PT_MISC, "",
                $currency, "Cannot insert a destination bank transaction");
 
-       $currency = get_bank_account_currency($to_account);
-       
-       add_exchange_variation($trans_type, $trans_no, $date_, $to_account, $to_gl_account, 
-               $currency, PT_MISC, "");
+       if ($SysPrefs->auto_currency_revaluation())
+       {
+               $currency = get_bank_account_currency($to_account);
        
+               if ($exchanged || add_exchange_variation($trans_no1, $date_, $to_account, $to_gl_account,       $currency))
+               {
+                       $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);
@@ -142,14 +166,14 @@ function add_bank_transfer($from_account, $to_account, $date_,
 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;
+       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();
 
@@ -188,7 +212,9 @@ function add_bank_transaction($trans_type, $from_account, $items, $date_,
     else
     {
        $trans_no = get_next_trans_no($trans_type);
-       $do_exchange_variance = true;
+       $do_exchange_variance = $SysPrefs->auto_currency_revaluation();
+       if ($do_exchange_variance)
+               $trans_no1 = get_next_trans_no(ST_JOURNAL);
     }
 
        // do the source account postings
@@ -221,8 +247,11 @@ function add_bank_transaction($trans_type, $from_account, $items, $date_,
                        $person_type_id, $person_id, $currency,
                        "Cannot insert a destination bank transaction");
                if ($do_exchange_variance)
-                       add_exchange_variation($trans_type, $trans_no, $date_, $is_bank_to, $gl_item->code_id, 
-                               $currency, $person_type_id, $person_id);
+               {
+                       if (add_exchange_variation($trans_no1, $date_, $is_bank_to, $gl_item->code_id, 
+                               $currency, $person_type_id, $person_id))
+                               $exchanged = true;
+               }               
        }
                // store tax details if the gl account is a tax account
 
@@ -238,9 +267,15 @@ function add_bank_transaction($trans_type, $from_account, $items, $date_,
        -$total, null, $person_type_id, $person_id);
 
     if ($do_exchange_variance)
-       add_exchange_variation($trans_type, $trans_no, $date_, $from_account, $bank_gl_account, 
-               $currency, $person_type_id, $person_id);
-
+    {
+       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);