2 CREATE OR REPLACE FUNCTION importBankrecCleared(pBankrecid INTEGER) RETURNS BOOLEAN AS $$
3 -- Copyright (c) 1999-2014 by OpenMFG LLC, d/b/a xTuple.
4 -- See www.xtuple.com/CPAL for the full text of the software license.
16 -- cache some information
17 IF (pBankrecid = -1) THEN
18 _bankrecid = fetchMetricValue('ImportBankRecId');
20 _bankrecid = pBankrecid;
24 FROM bankrec JOIN bankaccnt ON (bankaccnt_id=bankrec_bankaccnt_id)
25 WHERE (bankrec_id=_bankrecid);
27 RAISE EXCEPTION 'bankrec not found';
29 IF (_b.bankrec_posted) THEN
30 RAISE EXCEPTION 'bankrec already posted';
33 -- loop thru bankrecimport and toggle cleared items
36 COALESCE(bankrecimport_debit_amount, 0.0) AS debit,
37 COALESCE(bankrecimport_credit_amount, 0.0) AS credit
39 -- TODO how to handle multiple bank accounts
40 -- WHERE (bankrecimport_?=_b.bankaccnt=?)
43 -- TODO how to handle duplicate document numbers
44 -- TODO how to handle amount differences
45 -- TODO add support for Project Accounting (sltrans)
47 IF ( (_r.debit > 0.0) AND (_r.credit > 0.0) ) THEN
48 RAISE NOTICE 'Bankrecimport % cannot determine if debit or credit', _r.bankrecimport_reference;
52 IF (_r.debit > 0.0) THEN
56 SELECT cashrcpt_id INTO _docid
58 WHERE (cashrcpt_docnumber=_r.bankrecimport_reference)
60 AND (NOT cashrcpt_void)
61 -- TODO workaround for duplicates
62 ORDER BY cashrcpt_id DESC
65 SELECT toggleBankrecCleared(_b.bankrec_id, 'GL', gltrans_id,
66 cashrcpt_curr_rate, _r.debit,
67 _r.bankrecimport_effdate) INTO _cleared
68 FROM cashrcpt JOIN gltrans ON ((gltrans_source='A/R')
69 AND (gltrans_doctype='CR')
71 AND (gltrans_accnt_id=_b.bankaccnt_accnt_id)
72 AND (gltrans_misc_id=cashrcpt_id))
73 LEFT OUTER JOIN bankrecitem ON (bankrecitem_source='GL' AND
74 bankrecitem_source_id=gltrans_id)
75 WHERE (cashrcpt_id=_docid)
76 AND (NOT COALESCE(bankrecitem_cleared, FALSE));
79 -- create and toggle bank adjustment
80 -- TODO define bank adjustment names
83 SELECT bankadj_id INTO _bankadjid
84 FROM bankadj JOIN bankadjtype ON (bankadjtype_id=bankadj_bankadjtype_id)
85 WHERE (bankadjtype_id=fetchMetricValue('ImportBankRecDebitAdj'))
86 AND (bankadj_docnumber=_r.bankrecimport_reference);
89 (bankadj_bankaccnt_id, bankadj_bankadjtype_id, bankadj_date, bankadj_docnumber,
90 bankadj_amount, bankadj_notes, bankadj_curr_id)
92 _b.bankaccnt_id, bankadjtype_id, _r.bankrecimport_effdate, _r.bankrecimport_reference,
93 _r.debit, 'Import Bankrec Adjustment', _b.bankaccnt_curr_id
95 WHERE (bankadjtype_id=fetchMetricValue('ImportBankRecDebitAdj'))
96 RETURNING bankadj_id INTO _bankadjid;
99 IF (_bankadjid > 0) THEN
100 SELECT toggleBankrecCleared(_b.bankrec_id, 'AD', _bankadjid,
102 _r.bankrecimport_effdate) INTO _cleared
103 FROM bankadj LEFT OUTER JOIN bankrecitem ON (bankrecitem_source='AD' AND
104 bankrecitem_source_id=_bankadjid)
105 WHERE (NOT COALESCE(bankrecitem_cleared, FALSE));
107 RAISE EXCEPTION 'bankadjtype not found';
111 -- done with receipts
117 SELECT checkhead_id INTO _docid
119 WHERE (checkhead_number::TEXT=_r.bankrecimport_reference)
120 AND (checkhead_posted)
121 AND (NOT checkhead_void);
123 SELECT toggleBankrecCleared(_b.bankrec_id, 'GL', gltrans_id,
124 checkhead_curr_rate, _r.credit,
125 _r.bankrecimport_effdate) INTO _cleared
126 FROM checkhead JOIN gltrans ON ((gltrans_source='A/P')
127 AND (gltrans_doctype='CK')
128 AND (NOT gltrans_rec)
129 AND (gltrans_accnt_id=_b.bankaccnt_accnt_id)
130 AND (gltrans_misc_id=checkhead_id))
131 LEFT OUTER JOIN bankrecitem ON (bankrecitem_source='GL' AND
132 bankrecitem_source_id=gltrans_id)
133 WHERE (checkhead_id=_docid)
134 AND (NOT COALESCE(bankrecitem_cleared, FALSE));
137 -- create and toggle bank adjustment
138 -- TODO define bank adjustment names
141 SELECT bankadj_id INTO _bankadjid
142 FROM bankadj JOIN bankadjtype ON (bankadjtype_id=bankadj_bankadjtype_id)
143 WHERE (bankadjtype_id=fetchMetricValue('ImportBankRecCreditAdj'))
144 AND (bankadj_docnumber=_r.bankrecimport_reference);
147 (bankadj_bankaccnt_id, bankadj_bankadjtype_id, bankadj_date, bankadj_docnumber,
148 bankadj_amount, bankadj_notes, bankadj_curr_id)
150 _b.bankaccnt_id, bankadjtype_id, _r.bankrecimport_effdate, _r.bankrecimport_reference,
151 _r.credit, 'Import Bankrec Adjustment', _b.bankaccnt_curr_id
153 WHERE (bankadjtype_id=fetchMetricValue('ImportBankRecCreditAdj'))
154 RETURNING bankadj_id INTO _bankadjid;
157 IF (_bankadjid > 0) THEN
158 SELECT toggleBankrecCleared(_b.bankrec_id, 'AD', _bankadjid,
160 _r.bankrecimport_effdate) INTO _cleared
161 FROM bankadj LEFT OUTER JOIN bankrecitem ON (bankrecitem_source='AD' AND
162 bankrecitem_source_id=_bankadjid)
163 WHERE (NOT COALESCE(bankrecitem_cleared, FALSE));
165 RAISE EXCEPTION 'bankadjtype not found';
177 $$ LANGUAGE 'plpgsql';