add some time-worked reporting
[freeside.git] / sql-ledger / sql / Pg-functions.sql
1 --
2 CREATE FUNCTION del_yearend() RETURNS OPAQUE AS '
3 begin
4   delete from yearend where trans_id = old.id;
5   return NULL;
6 end;
7 ' language 'plpgsql';
8 -- end function
9 --
10 CREATE TRIGGER del_yearend AFTER DELETE ON gl FOR EACH ROW EXECUTE PROCEDURE del_yearend();
11 -- end trigger
12 --
13 CREATE FUNCTION del_department() RETURNS OPAQUE AS '
14 begin
15   delete from dpt_trans where trans_id = old.id;
16   return NULL;
17 end;
18 ' language 'plpgsql';
19 -- end function
20 --
21 CREATE TRIGGER del_department AFTER DELETE ON ar FOR EACH ROW EXECUTE PROCEDURE del_department();
22 -- end trigger
23 CREATE TRIGGER del_department AFTER DELETE ON ap FOR EACH ROW EXECUTE PROCEDURE del_department();
24 -- end trigger
25 CREATE TRIGGER del_department AFTER DELETE ON gl FOR EACH ROW EXECUTE PROCEDURE del_department();
26 -- end trigger
27 CREATE TRIGGER del_department AFTER DELETE ON oe FOR EACH ROW EXECUTE PROCEDURE del_department();
28 -- end trigger
29 --
30 CREATE FUNCTION del_customer() RETURNS OPAQUE AS '
31 begin
32   delete from shipto where trans_id = old.id;
33   delete from customertax where customer_id = old.id;
34   delete from partscustomer where customer_id = old.id;
35   return NULL;
36 end;
37 ' language 'plpgsql';
38 -- end function
39 --
40 CREATE TRIGGER del_customer AFTER DELETE ON customer FOR EACH ROW EXECUTE PROCEDURE del_customer();
41 -- end trigger
42 --
43 CREATE FUNCTION del_vendor() RETURNS OPAQUE AS '
44 begin
45   delete from shipto where trans_id = old.id;
46   delete from vendortax where vendor_id = old.id;
47   delete from partsvendor where vendor_id = old.id;
48   return NULL;
49 end;
50 ' language 'plpgsql';
51 -- end function
52 --
53 CREATE TRIGGER del_vendor AFTER DELETE ON vendor FOR EACH ROW EXECUTE PROCEDURE del_vendor();
54 -- end trigger
55 --
56 CREATE FUNCTION del_exchangerate() RETURNS OPAQUE AS '
57
58 declare
59   t_transdate date;
60   t_curr char(3);
61   t_id int;
62   d_curr text;
63
64 begin
65
66   select into d_curr substr(curr,1,3) from defaults;
67   
68   if TG_RELNAME = ''ar'' then
69     select into t_curr, t_transdate curr, transdate from ar where id = old.id;
70   end if;
71   if TG_RELNAME = ''ap'' then
72     select into t_curr, t_transdate curr, transdate from ap where id = old.id;
73   end if;
74   if TG_RELNAME = ''oe'' then
75     select into t_curr, t_transdate curr, transdate from oe where id = old.id;
76   end if;
77
78   if d_curr != t_curr then
79
80     select into t_id a.id from acc_trans ac
81     join ar a on (a.id = ac.trans_id)
82     where a.curr = t_curr
83     and ac.transdate = t_transdate
84
85     except select a.id from ar a where a.id = old.id
86     
87     union
88     
89     select a.id from acc_trans ac
90     join ap a on (a.id = ac.trans_id)
91     where a.curr = t_curr
92     and ac.transdate = t_transdate
93     
94     except select a.id from ap a where a.id = old.id
95     
96     union
97     
98     select o.id from oe o
99     where o.curr = t_curr
100     and o.transdate = t_transdate
101     
102     except select o.id from oe o where o.id = old.id;
103
104     if not found then
105       delete from exchangerate where curr = t_curr and transdate = t_transdate;
106     end if;
107   end if;
108 return old;
109
110 end;
111 ' language 'plpgsql';
112 -- end function
113 --
114 CREATE TRIGGER del_exchangerate BEFORE DELETE ON ar FOR EACH ROW EXECUTE PROCEDURE del_exchangerate();
115 -- end trigger
116 --
117 CREATE TRIGGER del_exchangerate BEFORE DELETE ON ap FOR EACH ROW EXECUTE PROCEDURE del_exchangerate();
118 -- end trigger
119 --
120 CREATE TRIGGER del_exchangerate BEFORE DELETE ON oe FOR EACH ROW EXECUTE PROCEDURE del_exchangerate();
121 -- end trigger
122 --
123 CREATE FUNCTION check_inventory() RETURNS OPAQUE AS '
124
125 declare
126   itemid int;
127   row_data inventory%rowtype;
128
129 begin
130
131   if not old.quotation then
132     for row_data in select * from inventory where oe_id = old.id loop
133       select into itemid id from orderitems where trans_id = old.id and id = row_data.orderitems_id;
134
135       if itemid is null then
136         delete from inventory where oe_id = old.id and orderitems_id = row_data.orderitems_id;
137       end if;
138     end loop;
139   end if;
140   return old;
141 end;
142 ' language 'plpgsql';
143 -- end function
144 --
145 CREATE TRIGGER check_inventory AFTER UPDATE ON oe FOR EACH ROW EXECUTE PROCEDURE check_inventory();
146 -- end trigger
147 --
148 --
149 CREATE FUNCTION check_department() RETURNS OPAQUE AS '
150
151 declare
152   dpt_id int;
153
154 begin
155  
156   if new.department_id = 0 then
157     delete from dpt_trans where trans_id = new.id;
158     return NULL;
159   end if;
160
161   select into dpt_id trans_id from dpt_trans where trans_id = new.id;
162   
163   if dpt_id > 0 then
164     update dpt_trans set department_id = new.department_id where trans_id = dpt_id;
165   else
166     insert into dpt_trans (trans_id, department_id) values (new.id, new.department_id);
167   end if;
168 return NULL;
169
170 end;
171 ' language 'plpgsql';
172 -- end function
173 --
174 CREATE TRIGGER check_department AFTER INSERT OR UPDATE ON ar FOR EACH ROW EXECUTE PROCEDURE check_department();
175 -- end trigger
176 CREATE TRIGGER check_department AFTER INSERT OR UPDATE ON ap FOR EACH ROW EXECUTE PROCEDURE check_department();
177 -- end trigger
178 CREATE TRIGGER check_department AFTER INSERT OR UPDATE ON gl FOR EACH ROW EXECUTE PROCEDURE check_department();
179 -- end trigger
180 CREATE TRIGGER check_department AFTER INSERT OR UPDATE ON oe FOR EACH ROW EXECUTE PROCEDURE check_department();
181 -- end trigger
182 --