Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
[kivitendo-erp.git] / sql / Pg-upgrade2 / convert_curr_to_text.sql
1 -- @tag: convert_curr_to_text
2 -- @description: Spalte 'curr' von 'char(3)' nach 'text' konvertieren
3 -- @depends: release_2_7_0
4 -- @charset: utf-8
5
6 -- Zuerst alle Spaltentypen konvertieren.
7 ALTER TABLE ap              ALTER COLUMN curr TYPE text;
8 ALTER TABLE ar              ALTER COLUMN curr TYPE text;
9 ALTER TABLE customer        ALTER COLUMN curr TYPE text;
10 ALTER TABLE delivery_orders ALTER COLUMN curr TYPE text;
11 ALTER TABLE exchangerate    ALTER COLUMN curr TYPE text;
12 ALTER TABLE rma             ALTER COLUMN curr TYPE text;
13 ALTER TABLE vendor          ALTER COLUMN curr TYPE text;
14
15 -- Eventuell falsche Inhalte (Leerzeichenpadding) auf leere Strings setzen.
16 UPDATE ap              SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
17 UPDATE ar              SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
18 UPDATE customer        SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
19 UPDATE delivery_orders SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
20 UPDATE exchangerate    SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
21 UPDATE oe              SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
22 UPDATE rma             SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
23 UPDATE vendor          SET curr = '' WHERE (curr SIMILAR TO '^ +$') OR (curr IS NULL);
24
25 -- Nun noch die stored procedures anpassen.
26 CREATE OR REPLACE FUNCTION del_exchangerate() RETURNS trigger
27   LANGUAGE plpgsql
28   AS $$
29     DECLARE
30       t_transdate date;
31       t_curr      text;
32       t_id        int;
33       d_curr      text;
34     BEGIN
35       SELECT INTO d_curr substring(curr FROM '[^:]*') FROM DEFAULTS;
36
37       IF TG_RELNAME = 'ar' THEN
38         SELECT INTO t_curr, t_transdate curr, transdate FROM ar WHERE id = old.id;
39       END IF;
40
41       IF TG_RELNAME = 'ap' THEN
42         SELECT INTO t_curr, t_transdate curr, transdate FROM ap WHERE id = old.id;
43       END IF;
44
45       IF TG_RELNAME = 'oe' THEN
46         SELECT INTO t_curr, t_transdate curr, transdate FROM oe WHERE id = old.id;
47       END IF;
48
49       IF TG_RELNAME = 'delivery_orders' THEN
50         SELECT INTO t_curr, t_transdate curr, transdate FROM delivery_orders WHERE id = old.id;
51       END IF;
52
53       IF d_curr != t_curr THEN
54         SELECT INTO t_id a.id FROM acc_trans ac
55           JOIN ar a ON (a.id = ac.trans_id)
56           WHERE (a.curr       = t_curr)
57             AND (ac.transdate = t_transdate)
58         EXCEPT SELECT a.id
59           FROM ar a
60           WHERE (a.id = old.id)
61
62         UNION
63
64         SELECT a.id
65           FROM acc_trans ac
66           JOIN ap a ON (a.id = ac.trans_id)
67           WHERE (a.curr       = t_curr)
68             AND (ac.transdate = t_transdate)
69         EXCEPT SELECT a.id
70           FROM ap a
71           WHERE (a.id = old.id)
72
73         UNION
74
75         SELECT o.id
76           FROM oe o
77           WHERE (o.curr      = t_curr)
78             AND (o.transdate = t_transdate)
79         EXCEPT SELECT o.id
80         FROM oe o
81         WHERE (o.id = old.id)
82
83         UNION
84
85         SELECT dord.id
86           FROM delivery_orders dord
87           WHERE (dord.curr      = t_curr)
88             AND (dord.transdate = t_transdate)
89         EXCEPT SELECT dord.id
90         FROM delivery_orders dord
91         WHERE (dord.id = old.id);
92
93         IF NOT FOUND THEN
94           DELETE FROM exchangerate
95           WHERE (curr      = t_curr)
96             AND (transdate = t_transdate);
97         END IF;
98       END IF;
99
100       RETURN old;
101     END;
102 $$;
103
104 -- Und die stored procedure auch auf delivery_orders anwenden
105 CREATE TRIGGER del_exchangerate
106     BEFORE DELETE ON delivery_orders
107     FOR EACH ROW
108     EXECUTE PROCEDURE del_exchangerate();