pgsql/investigations/ar-cash.sql
[Pman.Xtuple] / pgsql / x-dragon-aropen-accountcheck.sql
1
2 CREATE OR REPLACE FUNCTION aropen_accountcheck_all()
3     RETURNS  TEXT
4     
5 AS $BODY$
6 DECLARE   
7     _r RECORD;
8     v_gltrans_val NUMERIC;
9
10 BEGIN
11     FOR _r IN SELECT
12                         araging_docnumber,
13                         araging_doctype,
14                         araging_total_val
15               FROM
16                         araging(current_date,TRUE)
17               ORDER BY
18                         araging_docnumber LOOP
19
20             SELECT aropen_accountcheck(_r.araging_docnumber) INTO v_gltrans_val;
21             
22             IF _r.araging_total_val + v_gltrans_val <> 0 THEN
23                 RAISE EXCEPTION 'araging_docnumber = % , araging_doctype = % , GL is = % , AR is = %',_r.araging_docnumber,_r.araging_doctype,v_gltrans_val,_r.araging_total_val;
24             END IF;
25     END LOOP;
26     
27     RETURN 'OK';
28   
29
30 END;
31 $BODY$
32   LANGUAGE plpgsql VOLATILE
33   COST 100;
34   
35 ALTER FUNCTION aropen_accountcheck_all()
36   OWNER TO admin;
37
38
39 CREATE OR REPLACE FUNCTION aropen_accountcheck(i_docnumber TEXT)
40     RETURNS  NUMERIC
41     
42 AS $BODY$
43 DECLARE   
44     v_related TEXT[];
45     v_gltrans_related TEXT[];
46     v_cashrcpt_related INT[];
47     v_ar_accnt_id INTEGER;
48     v_cd_accnt_id INTEGER;
49     v_cashrcptitem_id INTEGER;
50     v_result NUMERIC;
51 BEGIN
52
53     SELECT 
54             araccnt_ar_accnt_id 
55     INTO
56             v_ar_accnt_id
57     FROM
58             araccnt
59     WHERE
60             araccnt_custtype = '.*'
61     LIMIT 1;
62
63     IF NOT FOUND THEN
64         RAISE EXCEPTION 'Missing Account Receivable Account';
65     END IF;
66
67     SELECT 
68             accnt_id
69     INTO
70             v_cd_accnt_id
71     FROM
72             accnt
73     WHERE
74             accnt_descrip = 'Customer Deposits'
75     LIMIT 1;
76
77     IF NOT FOUND THEN
78         RAISE EXCEPTION 'Missing Customer Deposits Account';
79     END IF;
80  
81     v_related:= ARRAY[]::TEXT[];
82     v_gltrans_related := ARRAY[]::TEXT[];
83     v_cashrcpt_related := ARRAY[]::INT[];
84
85     SELECT aropen_related(i_docnumber, v_related) INTO v_related;
86
87     FOR i IN 1 .. array_upper(v_related,1) LOOP
88         IF (TRUE = ((SELECT strpos(v_related[i]::TEXT, '::')) > 0)) THEN
89
90             SELECT split_part(v_related[i]::TEXT, '::', 2) INTO v_cashrcptitem_id;
91
92             SELECT array_append(v_cashrcpt_related, v_cashrcptitem_id) INTO v_cashrcpt_related;
93         ELSE
94             SELECT array_append(v_gltrans_related, v_related[i]) INTO v_gltrans_related;
95         END IF;
96     END LOOP;
97
98     SELECT
99             SUM(COALESCE(gltrans_amount,0))
100     INTO
101             v_result
102     FROM
103             gltrans
104     WHERE
105             gltrans_docnumber = ANY (v_gltrans_related)
106         AND
107             gltrans_accnt_id IN (v_ar_accnt_id, v_cd_accnt_id)
108         AND
109             gltrans_posted
110         AND
111             NOT gltrans_deleted;
112
113
114     SELECT
115             SUM(COALESCE(gltrans_amount,0)) + v_result
116     INTO
117             v_result
118     FROM
119             gltrans
120     WHERE
121             gltrans_misc_id IN (SELECT
122                                         DISTINCT(cashrcpt_id)
123                                 FROM
124                                         cashrcpt
125                                 LEFT JOIN 
126                                         cashrcptitem
127                                 ON
128                                         cashrcptitem_cashrcpt_id = cashrcpt_id
129                                 WHERE
130                                         cashrcptitem_id = ANY (v_cashrcpt_related))
131         AND
132             gltrans_source = 'A/R'
133         AND
134             gltrans_doctype = 'CR'
135         AND
136             gltrans_accnt_id IN (v_ar_accnt_id, v_cd_accnt_id)
137         AND
138             gltrans_posted
139         AND
140             NOT gltrans_deleted;
141
142
143     RAISE NOTICE 'GL IS %',v_result;
144
145     SELECT
146             
147             SUM(araging_total_val)
148
149     INTO
150             v_result
151     FROM
152             araging(current_date,TRUE)
153     WHERE
154             araging_docnumber = ANY (v_gltrans_related);
155 RAISE NOTICE 'AR IS %',v_result;
156
157     RETURN v_result;
158
159   
160
161 END;
162 $BODY$
163   LANGUAGE plpgsql VOLATILE
164   COST 100;
165   
166 ALTER FUNCTION aropen_accountcheck(TEXT)
167   OWNER TO admin;
168
169
170
171 CREATE OR REPLACE FUNCTION aropen_related(i_docnumber TEXT, i_related TEXT[])
172     RETURNS  TEXT[]
173     
174 AS $BODY$
175 DECLARE   
176     _r RECORD;
177     v_number TEXT;
178 BEGIN
179
180     IF (NOT ARRAY[i_docnumber] <@ i_related) THEN
181         SELECT array_append(i_related, i_docnumber) INTO i_related;
182     END IF;
183
184     SELECT split_part(i_docnumber, '::', 1) INTO i_docnumber;
185
186     FOR _r IN SELECT
187             *
188     FROM 
189             arapply
190     WHERE  
191             (arapply_target_docnumber = i_docnumber)
192         OR 
193             (arapply_source_docnumber = i_docnumber) LOOP
194
195         IF (_r.arapply_source_docnumber IS NOT NULL) THEN
196             v_number = _r.arapply_source_docnumber;
197         END IF;
198         
199         IF (_r.arapply_source_aropen_id = -1 AND _r.arapply_reftype IS NOT NULL AND _r.arapply_ref_id IS NOT NULL) THEN
200             v_number = _r.arapply_source_docnumber || '::' || _r.arapply_ref_id;
201         END IF;
202         
203         IF (NOT ARRAY[v_number] <@ i_related) THEN
204             SELECT aropen_related(v_number, i_related) INTO i_related;
205         END IF;
206         
207         IF (_r.arapply_target_docnumber IS NOT NULL) THEN
208             v_number = _r.arapply_target_docnumber;
209         END IF;
210         
211         IF (_r.arapply_target_aropen_id = -1 AND _r.arapply_reftype IS NOT NULL AND _r.arapply_ref_id IS NOT NULL) THEN
212             v_number = _r.arapply_target_docnumber || '::' || _r.arapply_ref_id;
213         END IF;
214
215         IF (NOT ARRAY[v_number] <@ i_related) THEN
216             SELECT aropen_related(v_number, i_related) INTO i_related;
217         END IF;
218         
219     END LOOP;
220     
221     RETURN i_related;
222   
223
224 END;
225 $BODY$
226   LANGUAGE plpgsql VOLATILE
227   COST 100;
228   
229 ALTER FUNCTION aropen_related(TEXT, TEXT[])
230   OWNER TO admin;