~openbias/bias-trunk/bias-public-trunk

« back to all changes in this revision

Viewing changes to bias_query/query_library.py

  • Committer: Jose Patricio
  • Date: 2011-10-19 03:16:40 UTC
  • Revision ID: josepato@bias.com.mx-20111019031640-05zd7r5lxwx084qu
el push inicial

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- encoding: utf-8 -*-
 
2
##############################################################################
 
3
#
 
4
#    OpenERP, Open Source Management Solution   
 
5
#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
 
6
#    $Id$
 
7
#
 
8
#    This program is free software: you can redistribute it and/or modify
 
9
#    it under the terms of the GNU General Public License as published by
 
10
#    the Free Software Foundation, either version 3 of the License, or
 
11
#    (at your option) any later version.
 
12
#
 
13
#    This program is distributed in the hope that it will be useful,
 
14
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
16
#    GNU General Public License for more details.
 
17
#
 
18
#    You should have received a copy of the GNU General Public License
 
19
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
20
#
 
21
##############################################################################
 
22
 
 
23
from osv import osv
 
24
from osv import fields
 
25
import time
 
26
 
 
27
#******************************************************************************************
 
28
#   Querys Library 
 
29
#******************************************************************************************
 
30
class query_tool(osv.osv):
 
31
    _inherit = 'query.tool'
 
32
 
 
33
    _columns = {
 
34
    }
 
35
 
 
36
    def init(self, cr):
 
37
    # MOVE ALL ACCOUNT MOVE LINE FROM ONE PARTNER ID TO OTHER
 
38
        cr.execute("""
 
39
DROP type IF EXISTS unify_account_partner_type CASCADE;
 
40
CREATE TYPE unify_account_partner_type AS (
 
41
        lid                     integer,
 
42
        pid                     integer,
 
43
        partner                 varchar,
 
44
        ref                     varchar,
 
45
        entry                   varchar 
 
46
        ); 
 
47
        """)
 
48
 
 
49
        cr.execute("""
 
50
CREATE OR REPLACE FUNCTION unify_account_partner(
 
51
        partner_from integer,
 
52
        partner_to integer
 
53
        ) RETURNS SETOF unify_account_partner_type AS $$
 
54
DECLARE
 
55
 r record ; pay record ;  i integer := 0 ;
 
56
BEGIN
 
57
    FOR r IN 
 
58
        SELECT l.id AS lid, l.move_id AS pid, p.name AS partner, l.ref, m.name AS entry
 
59
        FROM account_move_line l
 
60
        LEFT JOIN account_move m ON (l.move_id = m.id)
 
61
        LEFT JOIN res_partner p ON (l.partner_id = p.id)
 
62
        WHERE l.partner_id = partner_from
 
63
        LOOP
 
64
            i := i + 1;
 
65
                RAISE NOTICE 'count : %,%,%,%,%', i, r.lid, r.partner, r.ref, r.entry;
 
66
                UPDATE account_move_line SET partner_id = partner_to WHERE id = r.lid;
 
67
                RETURN NEXT r;
 
68
        END LOOP;
 
69
 
 
70
END
 
71
$$ LANGUAGE plpgsql;
 
72
        """)
 
73
 
 
74
        # CASH FLOW TAX REPORT 
 
75
 
 
76
        cr.execute("""
 
77
CREATE OR REPLACE FUNCTION get_tax_from_payments6(
 
78
    report_type varchar,
 
79
    date_start date,
 
80
    date_stop date,
 
81
    tax varchar,
 
82
    order_by varchar) RETURNS SETOF varchar AS $$
 
83
DECLARE
 
84
    all_accounts integer[] ; 
 
85
    all_moves integer[] ; 
 
86
    all_total numeric[] := ARRAY[0,0,0,0] ; 
 
87
    lid integer := 0 ;
 
88
    i integer := 0 ;
 
89
    indx integer := 1 ;
 
90
    indx_m integer := 1 ;
 
91
    doc_count integer := 0 ;
 
92
    pay_count integer := 0 ;
 
93
    reconcile integer := 0 ;
 
94
    r record ;
 
95
    r1 record ;
 
96
    r2 record ;
 
97
    r3 record ;
 
98
    r4 record ;
 
99
    r5 record ;
 
100
    debit numeric ;
 
101
    credit numeric ;
 
102
    tax_amount numeric ;
 
103
    query_type varchar := '' ;
 
104
    date_inv varchar := '' ;
 
105
    result varchar := '';
 
106
    acc_code varchar ;
 
107
    entry varchar := '' ;
 
108
BEGIN
 
109
    IF report_type = 'debit' THEN 
 
110
        query_type := ' AND l.debit > 0 ' ;
 
111
    ELSIF report_type = 'credit' THEN 
 
112
        query_type := ' AND l.credit > 0 ' ;
 
113
    END IF;
 
114
 
 
115
    FOR r IN EXECUTE 'SELECT id FROM account_account WHERE id IN '||tax
 
116
    LOOP
 
117
        all_accounts := array_append(all_accounts, r.id) ;
 
118
    END LOOP;
 
119
    
 
120
    indx := 1;
 
121
    WHILE all_accounts[indx] > 0
 
122
        LOOP
 
123
        SELECT code INTO acc_code FROM account_account WHERE id = all_accounts[indx];
 
124
        IF result = '' THEN 
 
125
            result := result||'"'||acc_code||'"';
 
126
            all_total[4+indx] := 0 ;
 
127
        ELSE
 
128
            result := result||',"'||acc_code||'"';
 
129
            all_total[4+indx] := 0 ;
 
130
        END IF;
 
131
        indx := indx + 1;
 
132
        END LOOP;
 
133
 
 
134
    RETURN NEXT '('
 
135
                ||'"no.",'
 
136
                ||'"doc_count",'
 
137
                ||'"date",'
 
138
                ||'"entry",'
 
139
                ||'"journal",'
 
140
                ||'"partner",'
 
141
                ||'"vat",'
 
142
                ||'"document",'
 
143
                ||'"number",'
 
144
                ||'"reference",'
 
145
                ||'"date_invoice",'
 
146
                ||'"account",'
 
147
                ||'"debit",'
 
148
                ||'"credit",'
 
149
                ||'"balance",'
 
150
                ||'"amount",'
 
151
                ||result
 
152
                ||')';
 
153
 
 
154
    FOR r IN EXECUTE 'SELECT 
 
155
    m.id, 
 
156
    SUM(l.debit) AS debit,
 
157
    SUM(l.credit) AS credit,
 
158
    MIN(l.date) AS date, 
 
159
    MIN(a.code) AS account,
 
160
    MIN(m.name) AS entry, 
 
161
    MIN(j.code) AS journal, 
 
162
    CASE WHEN MIN(partner.name) IS NULL THEN '||quote_literal('')||' 
 
163
    ELSE replace(MIN(partner.name), '||quote_literal('"')||', '||quote_literal('')||') END AS partner, 
 
164
    CASE WHEN MIN(partner.vat) IS NULL THEN '||quote_literal('')||' ELSE
 
165
    replace(replace(replace(MIN(partner.vat), '||quote_literal('-')||','||quote_literal('')||'), '
 
166
    ||quote_literal(' ')||','||quote_literal('')||'), chr(10),'||quote_literal('')||') END AS vat
 
167
    FROM account_move m 
 
168
    LEFT JOIN account_journal j ON (m.journal_id = j.id)
 
169
    LEFT JOIN account_move_line l ON (l.move_id = m.id)
 
170
    LEFT JOIN res_partner partner ON (l.partner_id = partner.id) 
 
171
    LEFT JOIN account_account a ON (l.account_id = a.id) 
 
172
    LEFT JOIN account_account_type t ON (a.user_type = t.id) 
 
173
    WHERE t.code = '||quote_literal('cash')
 
174
    ||' AND l.date BETWEEN '||quote_literal(date_start)||' AND '||quote_literal(date_stop)
 
175
    --||' and m.id = 990 '
 
176
    ||query_type
 
177
    ||' GROUP BY m.id'
 
178
    ||' ORDER BY '
 
179
    ||order_by
 
180
    LOOP
 
181
        i := i + 1;
 
182
        indx_m := 1;
 
183
        result := '';
 
184
        all_total[1] := all_total[1] + r.debit;
 
185
        all_total[2] := all_total[2] + r.credit;
 
186
        all_total[3] := all_total[3] + (r.debit - r.credit);
 
187
 
 
188
        --      Search how much document reconciled whit payment
 
189
        all_moves := NULL ;
 
190
        FOR r1 IN SELECT distinct(l.move_id) AS move_id 
 
191
            FROM account_move_line l LEFT JOIN account_journal j ON (l.journal_id = j.id)
 
192
            WHERE l.reconcile_id IN (SELECT DISTINCT(reconcile_id) FROM account_move_line WHERE move_id = r.id)
 
193
            AND j.type != 'cash'
 
194
            LOOP
 
195
                all_moves := array_append(all_moves, r1.move_id) ;
 
196
            END LOOP;
 
197
 
 
198
        doc_count := array_upper(all_moves,1);
 
199
 
 
200
        IF doc_count IS NULL THEN
 
201
            indx := 1 ;
 
202
            WHILE all_accounts[indx] > 0
 
203
            LOOP
 
204
                SELECT CASE WHEN SUM(l.debit) - SUM(l.credit) IS NULL THEN 0
 
205
                ELSE SUM(l.debit) - SUM(l.credit) END INTO tax_amount
 
206
                FROM account_move_line l WHERE move_id = r.id AND account_id = all_accounts[indx];
 
207
                IF result = '' THEN result := result||tax_amount; ELSE result := result||','||tax_amount; END IF;
 
208
                all_total[4+indx] := all_total[4+indx] + tax_amount;
 
209
                indx := indx + 1;
 
210
            END LOOP;
 
211
                
 
212
            RETURN NEXT '('
 
213
                ||i||','
 
214
                ||'0'||','
 
215
                ||'"'||r.date||'",'
 
216
                ||'"'||r.entry||'",'
 
217
                ||'"'||r.journal||'",'
 
218
                ||'"'||r.partner||'",'
 
219
                ||'"'||r.vat||'",'
 
220
                ||'"",'
 
221
                ||'"",'
 
222
                ||'"",'
 
223
                ||'"",'
 
224
                ||'"'||r.account||'",'
 
225
                ||r.debit||','
 
226
                ||r.credit||','
 
227
                ||r.debit-r.credit||','
 
228
                ||'"",'
 
229
                ||result
 
230
                ||')';
 
231
 
 
232
        ELSE    
 
233
            indx_m := 1;
 
234
            WHILE all_moves[indx_m] > 0
 
235
            LOOP
 
236
                SELECT number, reference INTO r3 FROM account_invoice WHERE move_id = all_moves[indx_m];
 
237
 
 
238
                SELECT m.name, MIN(m.date) AS date,
 
239
                CASE WHEN SUM(l.debit)-SUM(l.credit) IS NULL THEN 0 ELSE SUM(l.debit)-SUM(l.credit) END AS amount
 
240
                INTO r5 FROM account_move_line l LEFT JOIN account_account a ON (l.account_id = a.id)
 
241
                LEFT JOIN account_move m ON (l.move_id = m.id)
 
242
                WHERE move_id = all_moves[indx_m] AND a.type in ('payable','receivable') GROUP BY m.name;
 
243
 
 
244
                indx := 1;
 
245
                WHILE all_accounts[indx] > 0
 
246
                LOOP
 
247
                    SELECT CASE WHEN SUM(l.debit) - SUM(l.credit) IS NULL THEN 0
 
248
                    ELSE SUM(l.debit) - SUM(l.credit) END INTO tax_amount
 
249
                    FROM account_move_line l WHERE move_id = all_moves[indx_m] AND account_id = all_accounts[indx];
 
250
 
 
251
                    IF result = '' THEN result := result||tax_amount; ELSE result := result||','||tax_amount; END IF;
 
252
                    all_total[4+indx] := all_total[4+indx] + tax_amount;
 
253
                    indx := indx + 1;
 
254
                END LOOP;    
 
255
 
 
256
                all_total[4] := all_total[4] + r5.amount;
 
257
 
 
258
                indx := 1;
 
259
                IF indx_m = 1 THEN
 
260
                    RETURN NEXT '('
 
261
                ||i||','
 
262
                ||doc_count||','
 
263
                ||'"'||r.date||'",'
 
264
                ||'"'||r.entry||'",'
 
265
                ||'"'||r.journal||'",'
 
266
                ||'"'||r.partner||'",'
 
267
                ||'"'||r.vat||'",'
 
268
                ||'"'||r5.name||'",'
 
269
                ||'"'||r3.number||'",'
 
270
                ||'"'||r3.reference||'",'
 
271
                ||'"'||r5.date||'",'
 
272
                ||'"'||r.account||'",'
 
273
                ||r.debit||','
 
274
                ||r.credit||','
 
275
                ||r.debit-r.credit||','
 
276
                ||r5.amount||','
 
277
                ||result
 
278
                ||')';
 
279
                ELSE
 
280
                    RETURN NEXT '('
 
281
                ||i||','
 
282
                ||'"",'
 
283
                ||'"",'
 
284
                ||'"",'
 
285
                ||'"",'
 
286
                ||'"",'
 
287
                ||'"",'
 
288
                ||'"'||r5.name||'",'
 
289
                ||'"",'
 
290
                ||'"",'
 
291
                ||'"'||r5.date||'",'
 
292
                ||'"",'
 
293
                ||'"",'
 
294
                ||'"",'
 
295
                ||'"",'
 
296
                ||r5.amount||','
 
297
                ||result
 
298
                ||')';
 
299
                END IF;
 
300
                result := '';
 
301
                indx_m := indx_m + 1;
 
302
                
 
303
            END LOOP;    
 
304
        END IF;
 
305
    END LOOP;
 
306
        result := '';
 
307
        indx := 1;
 
308
        WHILE all_accounts[indx] > 0
 
309
        LOOP
 
310
        IF result = '' THEN 
 
311
            result := result||''||all_total[4+indx]||'';
 
312
        ELSE
 
313
            result := result||','||all_total[4+indx]||'';
 
314
        END IF;
 
315
        indx := indx + 1;
 
316
        END LOOP;
 
317
 
 
318
--RAISE NOTICE 'result : %,%', all_total,result ;
 
319
 
 
320
        RETURN NEXT '('
 
321
                ||'"",'
 
322
                ||'"",'
 
323
                ||'"",'
 
324
                ||'"",'
 
325
                ||'"",'
 
326
                ||'"",'
 
327
                ||'"",'
 
328
                ||'"",'
 
329
                ||'"",'
 
330
                ||'"",'
 
331
                ||'"",'
 
332
                ||'"TOTAL",'
 
333
                ||all_total[1]||','
 
334
                ||all_total[2]||','
 
335
                ||all_total[3]||','
 
336
                ||all_total[4]||',' 
 
337
                ||result
 
338
                ||')';
 
339
   
 
340
END
 
341
$$ LANGUAGE plpgsql;
 
342
        """)
 
343
 
 
344
query_tool()
 
345
 
 
346
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
 
347