X-Git-Url: https://delta.frontaccounting.com/gitweb/?a=blobdiff_plain;f=sales%2Fincludes%2Fdb%2Fpayment_db.inc;h=81ea49ce6ba625f96639eeff9d388ad9612ecc2c;hb=1734935f14ed161f322431481ed483dd2274f464;hp=12e7cc0fab833df3b19219c4fc50284a0092df10;hpb=d567a10b7925c8bb97c734e213d6651a979af29d;p=fa-stable.git diff --git a/sales/includes/db/payment_db.inc b/sales/includes/db/payment_db.inc index 12e7cc0f..81ea49ce 100644 --- a/sales/includes/db/payment_db.inc +++ b/sales/includes/db/payment_db.inc @@ -11,32 +11,59 @@ ***********************************************************************/ /* Write/update customer payment. + + Warning: $rate is leaved here for extensions compatibility reasons, will be removed in 2.4 + since 2.3.17 is not used: use $bank_amount instead. + + $amount - in customer currency (ex. discount) + $discount - in customer currency + $bank_amount - in bank currency (before charge) + $charge - in bank currency */ function write_customer_payment($trans_no, $customer_id, $branch_id, $bank_account, - $date_, $ref, $amount, $discount, $memo_, $rate=0) + $date_, $ref, $amount, $discount, $memo_, $rate=0, $charge=0, $bank_amount=0) { + global $Refs; + begin_transaction(); + $args = func_get_args(); while (count($args) < 12) $args[] = 0; + $args = (object)array_combine(array('trans_no', 'customer_id', 'branch_id', 'bank_account', + 'date_', 'ref', 'amount', 'discount', 'memo_','rate','charge', 'bank_amount'), $args); + hook_db_prewrite($args, ST_CUSTPAYMENT); $company_record = get_company_prefs(); - $payment_no = write_customer_trans(12, $trans_no, $customer_id, $branch_id, - $date_, $ref, $amount, $discount, 0, 0, 0, 0, 0, 0, 0, "", 0, $rate); + if ($trans_no != 0) { + delete_comments(ST_CUSTPAYMENT, $trans_no); + void_bank_trans(ST_CUSTPAYMENT, $trans_no, true); + void_gl_trans(ST_CUSTPAYMENT, $trans_no, true); + void_cust_allocations(ST_CUSTPAYMENT, $trans_no, $date_); + } - $bank_gl_account = get_bank_gl_account($bank_account); + $bank = get_bank_account($bank_account); - if ($trans_no != 0) { - delete_comments(12, $trans_no); - void_bank_trans(12, $trans_no, true); - void_gl_trans(12, $trans_no, true); - void_cust_allocations(12, $trans_no, $date_); + if (!$bank_amount) // backward compatibility workaround + { + if(!$rate) + $rate = get_exchange_rate_from_to(get_customer_currency($customer_id), + $bank['bank_curr_code'], $date_ ); + + $bank_amount = $amount/$rate; } + + // do not use $rate here: global rate stored in exrate table is always used + $payment_no = write_customer_trans(ST_CUSTPAYMENT, $trans_no, $customer_id, $branch_id, + $date_, $ref, $amount, $discount); + + $bank_gl_account = get_bank_gl_account($bank_account); + $total = 0; + /* Bank account entry first */ - $total += add_gl_trans_customer(12, $payment_no, $date_, - $bank_gl_account, 0, 0, $amount, $customer_id, - "Cannot insert a GL transaction for the bank account debit", $rate); + $total += add_gl_trans(ST_CUSTPAYMENT, $payment_no, $date_, + $bank_gl_account, 0, 0, '', ($bank_amount - $charge), $bank['bank_curr_code'], PT_CUSTOMER, $customer_id); - if ($branch_id != reserved_words::get_any_numeric()) { + if ($branch_id != ANY_NUMERIC) { $branch_data = get_branch_accounts($branch_id); @@ -50,29 +77,43 @@ function write_customer_payment($trans_no, $customer_id, $branch_id, $bank_accou if (($discount + $amount) != 0) { /* Now Credit Debtors account with receipts + discounts */ - $total += add_gl_trans_customer(12, $payment_no, $date_, + $total += add_gl_trans_customer(ST_CUSTPAYMENT, $payment_no, $date_, $debtors_account, 0, 0, -($discount + $amount), $customer_id, - "Cannot insert a GL transaction for the debtors account credit", $rate); + "Cannot insert a GL transaction for the debtors account credit"); } if ($discount != 0) { /* Now Debit discount account with discounts allowed*/ - $total += add_gl_trans_customer(12, $payment_no, $date_, + $total += add_gl_trans_customer(ST_CUSTPAYMENT, $payment_no, $date_, $discount_account, 0, 0, $discount, $customer_id, - "Cannot insert a GL transaction for the payment discount debit", $rate); + "Cannot insert a GL transaction for the payment discount debit"); + } + + if ($charge != 0) { + /* Now Debit bank charge account with charges */ + $charge_act = get_company_pref('bank_charge_act'); + $total += add_gl_trans(ST_CUSTPAYMENT, $payment_no, $date_, $charge_act, 0, 0, '', + $charge, $bank['bank_curr_code'], PT_CUSTOMER, $customer_id); } - /*Post a balance post if $total != 0 */ - add_gl_balance(12, $payment_no, $date_, -$total, payment_person_types::customer(), $customer_id); + + /*Post a balance post if $total != 0 due to variance in AR and bank posted values*/ + if ($total != 0) + { + $variance_act = get_company_pref('exchange_diff_act'); + add_gl_trans(ST_CUSTPAYMENT, $payment_no, $date_, $variance_act, 0, 0, '', + -$total, null, PT_CUSTOMER, $customer_id); + } /*now enter the bank_trans entry */ - add_bank_trans(12, $payment_no, $bank_account, $ref, - $date_, $amount, payment_person_types::customer(), $customer_id, - get_customer_currency($customer_id)); + add_bank_trans(ST_CUSTPAYMENT, $payment_no, $bank_account, $ref, + $date_, $bank_amount - $charge, PT_CUSTOMER, $customer_id); - add_comments(12, $payment_no, $date_, $memo_); + add_comments(ST_CUSTPAYMENT, $payment_no, $date_, $memo_); - references::save_last($ref, 12); + $Refs->save(ST_CUSTPAYMENT, $payment_no, $ref); + $args->trans_no = $payment_no; + hook_db_postwrite($args, ST_CUSTPAYMENT); commit_transaction(); return $payment_no; @@ -84,6 +125,7 @@ function void_customer_payment($type, $type_no) { begin_transaction(); + hook_db_prevoid($type, $type_no); void_bank_trans($type, $type_no, true); void_gl_trans($type, $type_no, true); void_cust_allocations($type, $type_no); @@ -92,5 +134,36 @@ function void_customer_payment($type, $type_no) commit_transaction(); } +/* + Retrieve bank charge amount from GL postings for customer payment. + . Bank charge is not stored explicitly in database as of 2.3.xx + . Due to roundings the retrieved charge can differ from the original amount when bank_curr!=home_curr && bank_curr!=cust_curr +*/ +function get_cust_bank_charge($type, $trans_no) +{ + + // restore charge amount from amounts in bank currency if possible, otherwise calculate from GL posting with exchange rate used for amount posting + $sql = "SELECT IF(act.bank_curr_code=home_curr.value, charge.amount, + IF(act.bank_curr_code=debtor.curr_code, -(trans.amount-ar.ov_amount+ar.ov_discount), + IFNULL(charge.amount*trans.amount/pmt.amount, 0))) + FROM ".TB_PREF."bank_trans trans + LEFT JOIN ".TB_PREF."bank_accounts act ON trans.bank_act=act.id + LEFT JOIN ".TB_PREF."sys_prefs charge_act ON charge_act.name='bank_charge_act' + LEFT JOIN ".TB_PREF."sys_prefs home_curr ON home_curr.name='curr_default' + LEFT JOIN ".TB_PREF."gl_trans charge ON charge.type=trans.type AND charge.type_no=trans.trans_no AND charge.account=charge_act.value + LEFT JOIN ".TB_PREF."gl_trans pmt ON pmt.type=trans.type AND pmt.type_no=trans.trans_no AND pmt.account=act.account_code + LEFT JOIN ".TB_PREF."debtors_master debtor ON trans.person_id=debtor.debtor_no AND trans.person_type_id=".PT_CUSTOMER." + LEFT JOIN ".TB_PREF."debtor_trans ar ON trans.type=ar.type AND trans.trans_no=ar.trans_no + WHERE pmt.amount!=0 AND charge.amount!=0 AND trans.amount!=0 + AND trans.type=".db_escape($type)." AND trans.trans_no=".db_escape($trans_no); + + $result = db_query($sql, "cannot retrieve bank charge"); + + if (!db_num_rows($result)) + return 0; + + $myrow = db_fetch($result); + return $myrow['0']; +} ?> \ No newline at end of file