Fixed warnings related to empty item/customer/supplier selector in search modes.
[fa-stable.git] / gl / includes / db / gl_db_bank_accounts.inc
1 <?php
2 /**********************************************************************
3     Copyright (C) FrontAccounting, LLC.
4         Released under the terms of the GNU General Public License, GPL,
5         as published by the Free Software Foundation, either version 3
6         of the License, or (at your option) any later version.
7     This program is distributed in the hope that it will be useful,
8     but WITHOUT ANY WARRANTY; without even the implied warranty of
9     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10     See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 //---------------------------------------------------------------------------------------------
13 function clear_dflt_curr_account($curr_code) {
14           $sql = "UPDATE ".TB_PREF."bank_accounts SET dflt_curr_act=0 WHERE bank_curr_code="
15           .db_escape($curr_code);
16           db_query($sql, "could not update default currency account");
17 }
18
19 function add_bank_account($account_code, $account_type, $bank_account_name,
20         $bank_name, $bank_account_number, $bank_address, $bank_curr_code, 
21         $dflt_curr_act, $bank_charge_act)
22 {
23         if($dflt_curr_act)      // only one default account for any currency
24           clear_dflt_curr_account($bank_curr_code);
25
26         $sql = "INSERT INTO ".TB_PREF."bank_accounts (account_code, account_type, 
27                 bank_account_name, bank_name, bank_account_number, bank_address, 
28                 bank_curr_code, dflt_curr_act, bank_charge_act)
29                 VALUES (".db_escape($account_code).", ".db_escape($account_type).", "
30                 .db_escape($bank_account_name).", ".db_escape($bank_name).", "
31                 .db_escape($bank_account_number).",".db_escape($bank_address).
32                 ", ".db_escape($bank_curr_code).", ".db_escape($dflt_curr_act).", ".db_escape($bank_charge_act).")";
33
34         db_query($sql, "could not add a bank account for $account_code");
35 }
36
37 //---------------------------------------------------------------------------------------------
38
39 function update_bank_account($id, $account_code, $account_type, $bank_account_name, 
40         $bank_name, $bank_account_number, $bank_address, $bank_curr_code, $dflt_curr_act, $bank_charge_act)
41 {
42         if($dflt_curr_act)      // only one default account for any currency
43           clear_dflt_curr_account($bank_curr_code);
44
45         $sql = "UPDATE ".TB_PREF."bank_accounts SET account_type = ".db_escape($account_type).",
46                 account_code=".db_escape($account_code).",
47                 bank_account_name=".db_escape($bank_account_name).", bank_name=".db_escape($bank_name).",
48                 bank_account_number=".db_escape($bank_account_number).", bank_curr_code=".db_escape($bank_curr_code).",
49                 bank_address=".db_escape($bank_address).",
50                 dflt_curr_act=".db_escape($dflt_curr_act).", bank_charge_act=".db_escape($bank_charge_act)." 
51                 WHERE id = ".db_escape($id);
52
53         db_query($sql, "could not update bank account for $account_code");
54 }
55
56 //---------------------------------------------------------------------------------------------
57
58 function delete_bank_account($id)
59 {
60         $sql = "DELETE FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($id);
61
62         db_query($sql,"could not delete bank account for $id");
63 }
64
65
66 //---------------------------------------------------------------------------------------------
67
68 function get_bank_account($id)
69 {
70         $sql = "SELECT * FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($id);
71
72         $result = db_query($sql, "could not retreive bank account for $id");
73
74         return db_fetch($result);
75 }
76
77 //---------------------------------------------------------------------------------------------
78
79 function get_bank_accounts($show_inactive=false)
80 {
81         $sql = "SELECT account.*, gl_account.account_name
82                 FROM ".TB_PREF."bank_accounts account, ".TB_PREF."chart_master gl_account
83                 WHERE account.account_code = gl_account.account_code";
84         if (!$show_inactive) $sql .= " AND !account.inactive";
85         $sql .= " ORDER BY account_code, bank_curr_code";
86
87         return db_query($sql,"could not get bank accounts");
88 }
89
90 //---------------------------------------------------------------------------------------------
91
92 function get_bank_gl_account($id)
93 {
94         $sql = "SELECT account_code FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($id);
95
96         $result = db_query($sql, "could not retreive bank account for $id");
97
98         $bank_account = db_fetch($result);
99
100         return $bank_account['account_code'];
101 }
102
103 //---------------------------------------------------------------------------------------------
104
105 function get_bank_charge_account($id)
106 {
107         $sql = "SELECT bank_charge_act FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($id);
108
109         $result = db_query($sql, "could not retreive bank account for $id");
110
111         $bank_account = db_fetch($result);
112
113         return $bank_account['bank_charge_act'];
114 }
115
116 //---------------------------------------------------------------------------------------------
117
118 function add_quick_entry($description, $type, $base_amount, $base_desc, $bal_type, $usage)
119 {
120         $sql = "INSERT INTO ".TB_PREF."quick_entries (description, type, base_amount, base_desc, bal_type, `usage`) 
121         VALUES (".db_escape($description).", ".db_escape($type).", "
122                 .db_escape($base_amount).", ".db_escape($base_desc).", ".db_escape($bal_type).", ".db_escape($usage).")";
123
124         db_query($sql, "could not insert quick entry for $description");
125 }
126
127 //---------------------------------------------------------------------------------------------
128
129 function update_quick_entry($selected_id, $description, $type, $base_amount, $base_desc, $bal_type, $usage)
130 {
131         $sql = "UPDATE ".TB_PREF."quick_entries SET description = ".db_escape($description).",
132                 type=".db_escape($type).", base_amount=".db_escape($base_amount)
133                 .", base_desc=".db_escape($base_desc).", bal_type=".db_escape($bal_type).", `usage`=".db_escape($usage)."
134                 WHERE id = ".db_escape($selected_id);
135
136         db_query($sql, "could not update quick entry for $selected_id");
137 }
138
139 //---------------------------------------------------------------------------------------------
140
141 function delete_quick_entry($selected_id)
142 {
143         $sql = "DELETE FROM ".TB_PREF."quick_entries WHERE id=".db_escape($selected_id);
144
145         db_query($sql,"could not delete quick entry $selected_id");
146 }
147
148 //---------------------------------------------------------------------------------------------
149
150 function add_quick_entry_line($qid, $action, $dest_id, $amount, $dim, $dim2, $memo)
151 {
152         $sql = "INSERT INTO ".TB_PREF."quick_entry_lines 
153                 (qid, action, dest_id, amount, dimension_id, dimension2_id, memo) 
154         VALUES 
155                 (".db_escape($qid).", ".db_escape($action).",".db_escape($dest_id).",
156                         ".db_escape($amount).", ".db_escape($dim).", ".db_escape($dim2).", ".db_escape($memo).")";
157
158         db_query($sql, "could not insert quick entry line for $qid");
159 }
160
161 //---------------------------------------------------------------------------------------------
162
163 function update_quick_entry_line($selected_id, $qid, $action, $dest_id, $amount, $dim, $dim2, $memo)
164 {
165         $sql = "UPDATE ".TB_PREF."quick_entry_lines SET qid = ".db_escape($qid)
166                 .", action=".db_escape($action).",
167                 dest_id=".db_escape($dest_id).", amount=".db_escape($amount)
168                 .", dimension_id=".db_escape($dim).", dimension2_id=".db_escape($dim2).", memo=".db_escape($memo)."
169                 WHERE id = ".db_escape($selected_id);
170
171         db_query($sql, "could not update quick entry line for $selected_id");
172 }
173
174 //---------------------------------------------------------------------------------------------
175
176 function delete_quick_entry_line($selected_id)
177 {
178         $sql = "DELETE FROM ".TB_PREF."quick_entry_lines WHERE id=".db_escape($selected_id);
179
180         db_query($sql,"could not delete quick entry line $selected_id");
181 }
182 //---------------------------------------------------------------------------------------------
183
184
185 function has_quick_entries($type=null)
186 {
187         $sql = "SELECT id FROM ".TB_PREF."quick_entries";
188         if ($type != null)
189                 $sql .= " WHERE type=".db_escape($type);
190
191         $result = db_query($sql, "could not retreive quick entries");
192         return db_num_rows($result) > 0;
193 }
194
195 function get_quick_entries($type = null)
196 {
197         $sql = "SELECT * FROM ".TB_PREF."quick_entries";
198         if ($type != null)
199                 $sql .= " WHERE type=".db_escape($type);
200         $sql .= " ORDER BY description";
201
202         return db_query($sql, "could not retreive quick entries");
203 }
204
205 function get_quick_entry($selected_id)
206 {
207         $sql = "SELECT * FROM ".TB_PREF."quick_entries WHERE id=".db_escape($selected_id);
208
209         $result = db_query($sql, "could not retreive quick entry $selected_id");
210
211         return db_fetch($result);
212 }
213
214 function get_quick_entry_lines($qid)
215 {
216         $sql = "SELECT line.*, coa.account_name, taxtype.name as tax_name
217                 FROM ".TB_PREF."quick_entry_lines line
218                         LEFT JOIN ".TB_PREF."chart_master coa ON line.dest_id = coa.account_code
219                         LEFT JOIN ".TB_PREF."tax_types taxtype ON line.dest_id = taxtype.id
220                 WHERE 
221                         qid=".db_escape($qid)." ORDER by id";
222
223         return db_query($sql, "could not retreive quick entries");
224 }
225
226 function has_quick_entry_lines($qid)
227 {
228         $sql = "SELECT id FROM ".TB_PREF."quick_entry_lines WHERE qid=".db_escape($qid);
229
230         $result = db_query($sql, "could not retreive quick entries");
231         return db_num_rows($result) > 0;
232 }
233
234 //---------------------------------------------------------------------------------------------
235
236 function get_quick_entry_line($selected_id)
237 {
238         $sql = "SELECT * FROM ".TB_PREF."quick_entry_lines WHERE id=".db_escape($selected_id);
239
240         $result = db_query($sql, "could not retreive quick entry for $selected_id");
241
242         return db_fetch($result);
243 }
244
245 //---------------------------------------------------------------------------------------------
246
247 function get_max_reconciled($date, $bank_account)
248 {
249         $date = date2sql($date);
250          // temporary fix to enable fix of invalid entries made in 2.2RC
251         if ($date == 0) $date = '0000-00-00';
252
253         $sql = "SELECT MAX(reconciled) as last_date,
254                          SUM(IF(reconciled<='$date', amount, 0)) as end_balance,
255                          SUM(IF(reconciled<'$date', amount, 0)) as beg_balance,
256                          SUM(amount) as total
257                 FROM ".TB_PREF."bank_trans trans
258                 WHERE bank_act=".db_escape($bank_account);
259         //      ." AND trans.reconciled IS NOT NULL";
260
261         return db_query($sql,"Cannot retrieve reconciliation data");
262
263 }
264
265 //---------------------------------------------------------------------------------------------
266
267 function get_ending_reconciled($bank_account, $bank_date)
268 {
269         $sql = "SELECT ending_reconcile_balance
270                 FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($bank_account)
271                 . " AND last_reconciled_date=".db_escape($bank_date);
272         $result = db_query($sql,"Cannot retrieve last reconciliation");
273         return db_fetch($result);
274 }
275
276 //---------------------------------------------------------------------------------------------
277
278 function get_sql_for_bank_account_reconcile($bank_account, $date)
279 {
280         $sql = "SELECT  bt.type, trans_no, ref, trans_date,
281                                 amount, person_id, person_type_id, reconciled, bt.id, c.memo_
282                 FROM ".TB_PREF."bank_trans bt
283                 LEFT JOIN ".TB_PREF."comments c ON c.type = bt.type AND c.id = bt.trans_no
284                 WHERE bank_act = ".db_escape($bank_account) . "
285                         AND (reconciled IS NULL OR reconciled='". date2sql($date) ."')
286                         AND amount != 0
287                 ORDER BY trans_date, bt.id";
288
289         return $sql;
290 }
291
292 //---------------------------------------------------------------------------------------------
293
294 function update_reconciled_values($reconcile_id, $reconcile_value, $reconcile_date, $end_balance, $bank_account)
295 {
296         $sql = "UPDATE ".TB_PREF."bank_trans SET reconciled=$reconcile_value"
297                 ." WHERE id=".db_escape($reconcile_id);
298
299         db_query($sql, "Can't change reconciliation status");
300         // save last reconcilation status (date, end balance)
301     $sql2 = "UPDATE ".TB_PREF."bank_accounts SET last_reconciled_date='"
302                         .date2sql($reconcile_date)."',
303             ending_reconcile_balance=$end_balance
304                         WHERE id=".db_escape($bank_account);
305
306         db_query($sql2,"Error updating reconciliation information");
307 }
308 //---------------------------------------------------------------------------------------------
309
310 function get_default_bank_account($curr=null)
311 {
312         /* default bank account is selected as first found account from:
313                 . default account in $curr if any
314                 . first defined account in $curr if any
315                 . default account in home currency
316                 . first defined account in home currency
317         */
318         $home_curr = get_company_pref('curr_default');
319         if (!isset($curr))
320                 $curr = $home_curr;
321
322         $sql = "SELECT b.*, b.bank_curr_code='$home_curr' as fall_back FROM "
323                 .TB_PREF."bank_accounts b"
324                 ." WHERE b.bank_curr_code=".db_escape($curr)
325                 ." OR b.bank_curr_code='$home_curr'
326                 ORDER BY fall_back, dflt_curr_act desc";
327
328         $result = db_query($sql, "could not retreive default bank account");
329
330         return db_fetch($result);
331 }
332
333 function get_default_customer_bank_account($cust_id)
334 {
335         $sql = "SELECT curr_code FROM ".TB_PREF."debtors_master WHERE debtor_no=".db_escape($cust_id);
336         $result = db_query($sql, "could not retreive default customer currency code");
337         $row = db_fetch_row($result);
338         $ba = get_default_bank_account($row[0]);
339         return $ba['id'];
340 }
341
342 function get_default_supplier_bank_account($supplier_id)
343 {
344         $sql = "SELECT curr_code FROM ".TB_PREF."suppliers WHERE supplier_id=".db_escape($supplier_id);
345         $result = db_query($sql, "could not retreive default supplier currency code");
346         $row = db_fetch_row($result);
347         $id = $row ? get_default_bank_account($row[0])['id'] : 0;
348         return $id;
349 }
350 //---------------------------------------------------------------------------------------------
351 //
352 //      This function returns current allowed bank payment limit, or null if limit is not set.
353 //      As of FA 2.3 check is done only on cash account, for which limit is bank amount as of the date selected.
354 //
355 function get_bank_account_limit($account, $date, $user=null)
356 {
357 //      $user = current_user();
358
359         $bankacc = get_bank_account($account);
360         if ($bankacc['account_type'] != BT_CASH)
361                 return null;
362         return max(0, get_balance_before_for_bank_account($account, add_days($date,1))); // in case of manco made before the check was implemented
363 }
364  
365 function identify_bank_account($account_number)
366 {
367         $number = db_escape($account_number);
368         $sql = "(SELECT id AS id, ".BO_COMPANY." AS type FROM ".TB_PREF."bank_accounts WHERE REPLACE(bank_account_number,' ', '')=$number)";
369         $sql .= " UNION (SELECT supplier_id AS id, ".BO_SUPPLIER." AS type FROM ".TB_PREF."suppliers WHERE REPLACE(bank_account,' ', '')=$number)";
370         $sql .= " UNION (SELECT branch_code AS id, ".BO_CUSTBRANCH." AS type FROM ".TB_PREF."cust_branch WHERE REPLACE(bank_account,' ', '')=$number)";
371
372         $result = db_query($sql, 'bank account identification failed');
373
374         if (db_num_rows($result))
375                 return db_fetch($result);
376         else
377                 return null;
378 }
379
380 //----------------------------------------------------------------------------------
381
382 function get_bank_account_currency($id)
383 {
384         $sql= "SELECT bank_curr_code FROM ".TB_PREF."bank_accounts WHERE id=".db_escape($id);
385         $result = db_query($sql, "retreive bank account currency");
386
387         $myrow = db_fetch_row($result);
388         return $myrow[0];
389 }
390