]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/sql/Pg/080.schema.money.sql
Make all FKs deferrable again
[working/Evergreen.git] / Open-ILS / src / sql / Pg / 080.schema.money.sql
1 /*
2  * Copyright (C) 2004-2008  Georgia Public Library Service
3  * Copyright (C) 2007-2008  Equinox Software, Inc.
4  * Mike Rylander <miker@esilibrary.com> 
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 DROP SCHEMA money CASCADE;
19
20 BEGIN;
21
22 CREATE SCHEMA money;
23
24 CREATE TABLE money.collections_tracker (
25         id              BIGSERIAL                       PRIMARY KEY,
26         usr             INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED, -- actor.usr.id
27         collector       INT                             NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
28         location        INT                             NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
29         enter_time      TIMESTAMP WITH TIME ZONE
30 );
31 CREATE UNIQUE INDEX m_c_t_usr_collector_location_once_idx ON money.collections_tracker (usr, collector, location);
32
33 CREATE TABLE money.billable_xact (
34         id          BIGSERIAL                   PRIMARY KEY,
35         usr         INT                         NOT NULL, -- actor.usr.id
36         xact_start  TIMESTAMP WITH TIME ZONE    NOT NULL DEFAULT NOW(),
37         xact_finish TIMESTAMP WITH TIME ZONE,
38     unrecovered BOOL
39 );
40 CREATE INDEX m_b_x_open_xacts_idx ON money.billable_xact (usr);
41
42 CREATE TABLE money.grocery ( -- Catchall table for local billing
43         billing_location        INT     NOT NULL, -- library creating transaction
44         note                    TEXT
45 ) INHERITS (money.billable_xact);
46 ALTER TABLE money.grocery ADD PRIMARY KEY (id);
47 CREATE INDEX circ_open_date_idx ON "money".grocery (xact_start) WHERE xact_finish IS NULL;
48 CREATE INDEX m_g_usr_idx ON "money".grocery (usr);
49
50 CREATE TABLE money.billing (
51         id              BIGSERIAL                       PRIMARY KEY,
52         xact            BIGINT                          NOT NULL, -- money.billable_xact.id
53         billing_ts      TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
54         voided          BOOL                            NOT NULL DEFAULT FALSE,
55         voider          INT,
56         void_time       TIMESTAMP WITH TIME ZONE,
57         amount          NUMERIC(6,2)                    NOT NULL,
58         billing_type    TEXT                            NOT NULL,
59         btype           INT                             NOT NULL REFERENCES config.billing_type (id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
60         note            TEXT
61 );
62 CREATE INDEX m_b_xact_idx ON money.billing (xact);
63 CREATE INDEX m_b_time_idx ON money.billing (billing_ts);
64
65 CREATE TABLE money.payment (
66         id              BIGSERIAL                       PRIMARY KEY,
67         xact            BIGINT                          NOT NULL, -- money.billable_xact.id
68         payment_ts      TIMESTAMP WITH TIME ZONE        NOT NULL DEFAULT NOW(),
69         voided          BOOL                            NOT NULL DEFAULT FALSE,
70         amount          NUMERIC(6,2)                    NOT NULL,
71         note            TEXT
72 );
73 CREATE INDEX m_p_xact_idx ON money.payment (xact);
74 CREATE INDEX m_p_time_idx ON money.payment (payment_ts);
75
76 CREATE OR REPLACE VIEW money.payment_view AS
77         SELECT  p.*,c.relname AS payment_type
78           FROM  money.payment p
79                 JOIN pg_class c ON (p.tableoid = c.oid);
80
81 CREATE OR REPLACE VIEW money.transaction_billing_type_summary AS
82         SELECT  xact,
83                 billing_type AS last_billing_type,
84                 LAST(note) AS last_billing_note,
85                 MAX(billing_ts) AS last_billing_ts,
86                 SUM(COALESCE(amount,0)) AS total_owed
87           FROM  money.billing
88           WHERE voided IS FALSE
89           GROUP BY xact,billing_type
90           ORDER BY MAX(billing_ts);
91
92 CREATE OR REPLACE VIEW money.transaction_billing_summary AS
93         SELECT  xact,
94                 LAST(billing_type) AS last_billing_type,
95                 LAST(note) AS last_billing_note,
96                 MAX(billing_ts) AS last_billing_ts,
97                 SUM(COALESCE(amount,0)) AS total_owed
98           FROM  money.billing
99           WHERE voided IS FALSE
100           GROUP BY xact
101           ORDER BY MAX(billing_ts);
102
103 CREATE OR REPLACE VIEW money.transaction_payment_summary AS
104         SELECT  xact,
105                 LAST(payment_type) AS last_payment_type,
106                 LAST(note) AS last_payment_note,
107                 MAX(payment_ts) as last_payment_ts,
108                 SUM(COALESCE(amount,0)) AS total_paid
109           FROM  money.payment_view
110           WHERE voided IS FALSE
111           GROUP BY xact
112           ORDER BY MAX(payment_ts);
113
114 CREATE OR REPLACE VIEW money.transaction_billing_with_void_summary AS
115         SELECT  xact,
116                 LAST(billing_type) AS last_billing_type,
117                 LAST(note) AS last_billing_note,
118                 MAX(billing_ts) AS last_billing_ts,
119                 SUM(CASE WHEN voided THEN 0 ELSE COALESCE(amount,0) END) AS total_owed
120           FROM  money.billing
121           GROUP BY xact
122           ORDER BY MAX(billing_ts);
123
124 CREATE OR REPLACE VIEW money.transaction_payment_with_void_summary AS
125         SELECT  xact,
126                 LAST(payment_type) AS last_payment_type,
127                 LAST(note) AS last_payment_note,
128                 MAX(payment_ts) as last_payment_ts,
129                 SUM(CASE WHEN voided THEN 0 ELSE COALESCE(amount,0) END) AS total_paid
130           FROM  money.payment_view
131           GROUP BY xact
132           ORDER BY MAX(payment_ts);
133
134 CREATE OR REPLACE VIEW money.open_transaction_billing_type_summary AS
135         SELECT  xact,
136                 billing_type AS last_billing_type,
137                 LAST(note) AS last_billing_note,
138                 MAX(billing_ts) AS last_billing_ts,
139                 SUM(COALESCE(amount,0)) AS total_owed
140           FROM  money.billing
141           WHERE voided IS FALSE
142           GROUP BY xact,billing_type
143           ORDER BY MAX(billing_ts);
144
145 CREATE OR REPLACE VIEW money.open_transaction_billing_summary AS
146         SELECT  xact,
147                 LAST(billing_type) AS last_billing_type,
148                 LAST(note) AS last_billing_note,
149                 MAX(billing_ts) AS last_billing_ts,
150                 SUM(COALESCE(amount,0)) AS total_owed
151           FROM  money.billing
152           WHERE voided IS FALSE
153           GROUP BY xact
154           ORDER BY MAX(billing_ts);
155
156 CREATE OR REPLACE VIEW money.open_transaction_payment_summary AS
157         SELECT  xact,
158                 LAST(payment_type) AS last_payment_type,
159                 LAST(note) AS last_payment_note,
160                 MAX(payment_ts) as last_payment_ts,
161                 SUM(COALESCE(amount,0)) AS total_paid
162           FROM  money.payment_view
163           WHERE voided IS FALSE
164           GROUP BY xact
165           ORDER BY MAX(payment_ts);
166
167 /* Replacing with the one below.
168 CREATE OR REPLACE VIEW money.billable_xact_with_void_summary AS
169         SELECT  xact.id AS id,
170                 xact.usr AS usr,
171                 xact.xact_start AS xact_start,
172                 xact.xact_finish AS xact_finish,
173                 credit.total_paid,
174                 credit.last_payment_ts,
175                 credit.last_payment_note,
176                 credit.last_payment_type,
177                 debit.total_owed,
178                 debit.last_billing_ts,
179                 debit.last_billing_note,
180                 debit.last_billing_type,
181                 COALESCE(debit.total_owed,0) - COALESCE(credit.total_paid,0) AS balance_owed,
182                 p.relname AS xact_type
183           FROM  money.billable_xact xact
184                 JOIN pg_class p ON (xact.tableoid = p.oid)
185                 LEFT JOIN money.transaction_billing_with_void_summary debit ON (xact.id = debit.xact)
186                 LEFT JOIN money.transaction_payment_with_void_summary credit ON (xact.id = credit.xact);
187 */
188
189 CREATE OR REPLACE VIEW money.billable_xact_with_void_summary AS
190         SELECT  xact.id AS id,
191                 xact.usr AS usr,
192                 xact.xact_start AS xact_start,
193                 xact.xact_finish AS xact_finish,
194                 SUM(credit.amount) AS total_paid,
195                 MAX(credit.payment_ts) AS last_payment_ts,
196                 LAST(credit.note) AS last_payment_note,
197                 LAST(credit.payment_type) AS last_payment_type,
198                 SUM(debit.amount) AS total_owed,
199                 MAX(debit.billing_ts) AS last_billing_ts,
200                 LAST(debit.note) AS last_billing_note,
201                 LAST(debit.billing_type) AS last_billing_type,
202                 COALESCE(SUM(debit.amount),0) - COALESCE(SUM(credit.amount),0) AS balance_owed,
203                 p.relname AS xact_type
204           FROM  money.billable_xact xact
205                 JOIN pg_class p ON (xact.tableoid = p.oid)
206                 LEFT JOIN money.billing debit ON (xact.id = debit.xact)
207                 LEFT JOIN money.payment_view credit ON (xact.id = credit.xact)
208           GROUP BY 1,2,3,4,14
209           ORDER BY MAX(debit.billing_ts), MAX(credit.payment_ts);
210
211 CREATE OR REPLACE VIEW money.billable_xact_summary AS
212         SELECT  xact.id,
213                 xact.usr,
214                 xact.xact_start,
215                 xact.xact_finish,
216                 credit.amount AS total_paid,
217                 credit.payment_ts AS last_payment_ts,
218                 credit.note AS last_payment_note,
219                 credit.payment_type AS last_payment_type,
220                 debit.amount AS total_owed,
221                 debit.billing_ts AS last_billing_ts,
222                 debit.note AS last_billing_note,
223                 debit.billing_type AS last_billing_type,
224                 COALESCE(debit.amount, 0::numeric) - COALESCE(credit.amount, 0::numeric) AS balance_owed,
225                 p.relname AS xact_type
226           FROM  money.billable_xact xact
227                 JOIN pg_class p ON xact.tableoid = p.oid
228                 LEFT JOIN (
229                         SELECT  billing.xact,
230                                 sum(billing.amount) AS amount,
231                                 max(billing.billing_ts) AS billing_ts,
232                                 last(billing.note) AS note,
233                                 last(billing.billing_type) AS billing_type
234                           FROM  money.billing
235                           WHERE billing.voided IS FALSE
236                           GROUP BY billing.xact
237                         ) debit ON xact.id = debit.xact
238                 LEFT JOIN (
239                         SELECT  payment_view.xact,
240                                 sum(payment_view.amount) AS amount,
241                                 max(payment_view.payment_ts) AS payment_ts,
242                                 last(payment_view.note) AS note,
243                                 last(payment_view.payment_type) AS payment_type
244                           FROM  money.payment_view
245                           WHERE payment_view.voided IS FALSE
246                           GROUP BY payment_view.xact
247                         ) credit ON xact.id = credit.xact
248           ORDER BY debit.billing_ts, credit.payment_ts;
249
250 CREATE TABLE money.materialized_billable_xact_summary AS
251         SELECT * FROM money.billable_xact_summary WHERE 1=0;
252
253 CREATE INDEX money_mat_summary_id_idx ON money.materialized_billable_xact_summary (id);
254 CREATE INDEX money_mat_summary_usr_idx ON money.materialized_billable_xact_summary (usr);
255 CREATE INDEX money_mat_summary_xact_start_idx ON money.materialized_billable_xact_summary (xact_start);
256
257 /* AFTER trigger only! */
258 CREATE OR REPLACE FUNCTION money.mat_summary_create () RETURNS TRIGGER AS $$
259 BEGIN
260         INSERT INTO money.materialized_billable_xact_summary (id, usr, xact_start, xact_finish, total_paid, total_owed, balance_owed)
261                 VALUES ( NEW.id, NEW.usr, NEW.xact_start, NEW.xact_finish, 0.0, 0.0, 0.0);
262         RETURN NEW;
263 END;
264 $$ LANGUAGE PLPGSQL;
265
266 /* BEFORE or AFTER trigger only! */
267 CREATE OR REPLACE FUNCTION money.mat_summary_update () RETURNS TRIGGER AS $$
268 BEGIN
269         UPDATE  money.materialized_billable_xact_summary
270           SET   usr = NEW.usr,
271                 xact_start = NEW.xact_start,
272                 xact_finish = NEW.xact_finish
273           WHERE id = NEW.id;
274         RETURN NEW;
275 END;
276 $$ LANGUAGE PLPGSQL;
277
278 /* AFTER trigger only! */
279 CREATE OR REPLACE FUNCTION money.mat_summary_delete () RETURNS TRIGGER AS $$
280 BEGIN
281         DELETE FROM money.materialized_billable_xact_summary WHERE id = OLD.id;
282         RETURN OLD;
283 END;
284 $$ LANGUAGE PLPGSQL;
285
286 CREATE TRIGGER mat_summary_create_tgr AFTER INSERT ON money.grocery FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_create ();
287 CREATE TRIGGER mat_summary_change_tgr AFTER UPDATE ON money.grocery FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_update ();
288 CREATE TRIGGER mat_summary_remove_tgr AFTER DELETE ON money.grocery FOR EACH ROW EXECUTE PROCEDURE money.mat_summary_delete ();
289
290
291
292 /* BEFORE or AFTER trigger */
293 CREATE OR REPLACE FUNCTION money.materialized_summary_billing_add () RETURNS TRIGGER AS $$
294 BEGIN
295         IF NOT NEW.voided THEN
296                 UPDATE  money.materialized_billable_xact_summary
297                   SET   total_owed = total_owed + NEW.amount,
298                         last_billing_ts = NEW.billing_ts,
299                         last_billing_note = NEW.note,
300                         last_billing_type = NEW.billing_type,
301                         balance_owed = balance_owed + NEW.amount
302                   WHERE id = NEW.xact;
303         END IF;
304
305         RETURN NEW;
306 END;
307 $$ LANGUAGE PLPGSQL;
308
309 /* AFTER trigger only! */
310 CREATE OR REPLACE FUNCTION money.materialized_summary_billing_update () RETURNS TRIGGER AS $$
311 DECLARE
312         old_billing     money.billing%ROWTYPE;
313         old_voided      money.billing%ROWTYPE;
314 BEGIN
315
316         SELECT * INTO old_billing FROM money.billing WHERE xact = NEW.xact AND NOT voided ORDER BY billing_ts DESC LIMIT 1;
317         SELECT * INTO old_voided FROM money.payment_view WHERE xact = NEW.xact ORDER BY payment_ts DESC LIMIT 1;
318
319         IF NEW.voided AND NOT OLD.voided THEN
320                 IF OLD.id = old_voided.id THEN
321                         UPDATE  money.materialized_billable_xact_summary
322                           SET   last_billing_ts = old_billing.billing_ts,
323                                 last_billing_note = old_billing.note,
324                                 last_billing_type = old_billing.billing_type
325                           WHERE id = OLD.xact;
326                 END IF;
327
328                 UPDATE  money.materialized_billable_xact_summary
329                   SET   total_owed = total_owed - NEW.amount,
330                         balance_owed = balance_owed - NEW.amount
331                   WHERE id = NEW.xact;
332
333         ELSIF NOT NEW.voided AND OLD.voided THEN
334
335                 IF OLD.id = old_billing.id THEN
336                         UPDATE  money.materialized_billable_xact_summary
337                           SET   last_billing_ts = old_billing.billing_ts,
338                                 last_billing_note = old_billing.note,
339                                 last_billing_type = old_billing.billing_type
340                           WHERE id = OLD.xact;
341                 END IF;
342
343                 UPDATE  money.materialized_billable_xact_summary
344                   SET   total_owed = total_owed + NEW.amount,
345                         balance_owed = balance_owed + NEW.amount
346                   WHERE id = NEW.xact;
347
348         ELSE
349                 UPDATE  money.materialized_billable_xact_summary
350                   SET   total_owed = total_owed - (OLD.amount - NEW.amount),
351                         balance_owed = balance_owed - (OLD.amount - NEW.amount)
352                   WHERE id = NEW.xact;
353         END IF;
354
355         RETURN NEW;
356 END;
357 $$ LANGUAGE PLPGSQL;
358
359 /* BEFORE trigger only! */
360 CREATE OR REPLACE FUNCTION money.materialized_summary_billing_del () RETURNS TRIGGER AS $$
361 DECLARE
362         prev_billing    money.billing%ROWTYPE;
363         old_billing     money.billing%ROWTYPE;
364 BEGIN
365         SELECT * INTO prev_billing FROM money.billing WHERE xact = OLD.xact AND NOT voided ORDER BY billing_ts DESC LIMIT 1 OFFSET 1;
366         SELECT * INTO old_billing FROM money.billing WHERE xact = OLD.xact AND NOT voided ORDER BY billing_ts DESC LIMIT 1;
367
368         IF OLD.id = old_billing.id THEN
369                 UPDATE  money.materialized_billable_xact_summary
370                   SET   last_billing_ts = prev_billing.billing_ts,
371                         last_billing_note = prev_billing.note,
372                         last_billing_type = prev_billing.billing_type
373                   WHERE id = NEW.xact;
374         END IF;
375
376         IF NOT OLD.voided THEN
377                 UPDATE  money.materialized_billable_xact_summary
378                   SET   total_owed = total_owed - OLD.amount,
379                         balance_owed = balance_owed + OLD.amount
380                   WHERE id = OLD.xact;
381         END IF;
382
383         RETURN OLD;
384 END;
385 $$ LANGUAGE PLPGSQL;
386
387 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.billing FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_billing_add ();
388 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.billing FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_billing_update ();
389 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.billing FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_billing_del ();
390
391
392 /* BEFORE or AFTER trigger */
393 CREATE OR REPLACE FUNCTION money.materialized_summary_payment_add () RETURNS TRIGGER AS $$
394 BEGIN
395         IF NOT NEW.voided THEN
396                 UPDATE  money.materialized_billable_xact_summary
397                   SET   total_paid = total_paid + NEW.amount,
398                         last_payment_ts = NEW.payment_ts,
399                         last_payment_note = NEW.note,
400                         last_payment_type = TG_ARGV[0],
401                         balance_owed = balance_owed - NEW.amount
402                   WHERE id = NEW.xact;
403         END IF;
404
405         RETURN NEW;
406 END;
407 $$ LANGUAGE PLPGSQL;
408
409 /* AFTER trigger only! */
410 CREATE OR REPLACE FUNCTION money.materialized_summary_payment_update () RETURNS TRIGGER AS $$
411 DECLARE
412         old_payment     money.payment_view%ROWTYPE;
413         old_voided      money.payment_view%ROWTYPE;
414 BEGIN
415
416         SELECT * INTO old_payment FROM money.payment_view WHERE xact = NEW.xact AND NOT voided ORDER BY payment_ts DESC LIMIT 1;
417         SELECT * INTO old_voided FROM money.payment_view WHERE xact = NEW.xact ORDER BY payment_ts DESC LIMIT 1;
418
419         IF NEW.voided AND NOT OLD.voided THEN
420                 IF OLD.id = old_voided.id THEN
421                         UPDATE  money.materialized_billable_xact_summary
422                           SET   last_payment_ts = old_payment.payment_ts,
423                                 last_payment_note = old_payment.note,
424                                 last_payment_type = old_payment.payment_type
425                           WHERE id = OLD.xact;
426                 END IF;
427
428                 UPDATE  money.materialized_billable_xact_summary
429                   SET   total_paid = total_paid - NEW.amount,
430                         balance_owed = balance_owed + NEW.amount
431                   WHERE id = NEW.xact;
432
433         ELSIF NOT NEW.voided AND OLD.voided THEN
434
435                 IF OLD.id = old_payment.id THEN
436                         UPDATE  money.materialized_billable_xact_summary
437                           SET   last_payment_ts = old_payment.payment_ts,
438                                 last_payment_note = old_payment.note,
439                                 last_payment_type = old_payment.payment_type
440                           WHERE id = OLD.xact;
441                 END IF;
442
443                 UPDATE  money.materialized_billable_xact_summary
444                   SET   total_paid = total_paid + NEW.amount,
445                         balance_owed = balance_owed - NEW.amount
446                   WHERE id = NEW.xact;
447
448         ELSE
449                 UPDATE  money.materialized_billable_xact_summary
450                   SET   total_paid = total_paid - (OLD.amount - NEW.amount),
451                         balance_owed = balance_owed + (OLD.amount - NEW.amount)
452                   WHERE id = NEW.xact;
453         END IF;
454
455         RETURN NEW;
456 END;
457 $$ LANGUAGE PLPGSQL;
458
459 /* BEFORE trigger only! */
460 CREATE OR REPLACE FUNCTION money.materialized_summary_payment_del () RETURNS TRIGGER AS $$
461 DECLARE
462         prev_payment    money.payment_view%ROWTYPE;
463         old_payment     money.payment_view%ROWTYPE;
464 BEGIN
465         SELECT * INTO prev_payment FROM money.payment_view WHERE xact = OLD.xact AND NOT voided ORDER BY payment_ts DESC LIMIT 1 OFFSET 1;
466         SELECT * INTO old_payment FROM money.payment_view WHERE xact = OLD.xact AND NOT voided ORDER BY payment_ts DESC LIMIT 1;
467
468         IF OLD.id = old_payment.id THEN
469                 UPDATE  money.materialized_billable_xact_summary
470                   SET   last_payment_ts = prev_payment.payment_ts,
471                         last_payment_note = prev_payment.note,
472                         last_payment_type = prev_payment.payment_type
473                   WHERE id = OLD.xact;
474         END IF;
475
476         IF NOT OLD.voided THEN
477                 UPDATE  money.materialized_billable_xact_summary
478                   SET   total_paid = total_paid - OLD.amount,
479                         balance_owed = balance_owed + OLD.amount
480                   WHERE id = OLD.xact;
481         END IF;
482
483         RETURN OLD;
484 END;
485 $$ LANGUAGE PLPGSQL;
486
487 CREATE OR REPLACE VIEW money.usr_summary AS
488         SELECT  usr,
489                 SUM(total_paid) AS total_paid,
490                 SUM(total_owed) AS total_owed, 
491                 SUM(balance_owed) AS balance_owed
492           FROM money.billable_xact_summary
493           GROUP BY 1;
494
495 CREATE OR REPLACE VIEW money.usr_circulation_summary AS
496         SELECT  usr,
497                 SUM(total_paid) AS total_paid,
498                 SUM(total_owed) AS total_owed, 
499                 SUM(balance_owed) AS balance_owed
500           FROM  money.billable_xact_summary
501           WHERE xact_type = 'circulation'
502           GROUP BY 1;
503
504 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('payment');
505 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('payment');
506 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('payment');
507
508 CREATE TABLE money.bnm_payment (
509         amount_collected        NUMERIC(6,2)    NOT NULL,
510         accepting_usr           INT             NOT NULL
511 ) INHERITS (money.payment);
512 ALTER TABLE money.bnm_payment ADD PRIMARY KEY (id);
513
514 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.bnm_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('bnm_payment');
515 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.bnm_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('bnm_payment');
516 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.bnm_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('bnm_payment');
517
518
519 CREATE TABLE money.forgive_payment () INHERITS (money.bnm_payment);
520 ALTER TABLE money.forgive_payment ADD PRIMARY KEY (id);
521 CREATE INDEX money_forgive_id_idx ON money.forgive_payment (id);
522 CREATE INDEX money_forgive_payment_xact_idx ON money.forgive_payment (xact);
523 CREATE INDEX money_forgive_payment_payment_ts_idx ON money.forgive_payment (payment_ts);
524 CREATE INDEX money_forgive_payment_accepting_usr_idx ON money.forgive_payment (accepting_usr);
525
526 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.forgive_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('forgive_payment');
527 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.forgive_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('forgive_payment');
528 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.forgive_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('forgive_payment');
529
530
531 CREATE TABLE money.work_payment () INHERITS (money.bnm_payment);
532 ALTER TABLE money.work_payment ADD PRIMARY KEY (id);
533 CREATE INDEX money_work_id_idx ON money.work_payment (id);
534 CREATE INDEX money_work_payment_xact_idx ON money.work_payment (xact);
535 CREATE INDEX money_work_payment_payment_ts_idx ON money.work_payment (payment_ts);
536 CREATE INDEX money_work_payment_accepting_usr_idx ON money.work_payment (accepting_usr);
537
538 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.work_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('work_payment');
539 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.work_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('work_payment');
540 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.work_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('work_payment');
541
542
543 CREATE TABLE money.credit_payment () INHERITS (money.bnm_payment);
544 ALTER TABLE money.credit_payment ADD PRIMARY KEY (id);
545 CREATE INDEX money_credit_id_idx ON money.credit_payment (id);
546 CREATE INDEX money_credit_payment_xact_idx ON money.credit_payment (xact);
547 CREATE INDEX money_credit_payment_payment_ts_idx ON money.credit_payment (payment_ts);
548 CREATE INDEX money_credit_payment_accepting_usr_idx ON money.credit_payment (accepting_usr);
549
550 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.credit_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('credit_payment');
551 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.credit_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('credit_payment');
552 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.credit_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('credit_payment');
553
554
555 CREATE TABLE money.goods_payment () INHERITS (money.bnm_payment);
556 ALTER TABLE money.goods_payment ADD PRIMARY KEY (id);
557 CREATE INDEX money_goods_id_idx ON money.goods_payment (id);
558 CREATE INDEX money_goods_payment_xact_idx ON money.goods_payment (xact);
559 CREATE INDEX money_goods_payment_payment_ts_idx ON money.goods_payment (payment_ts);
560 CREATE INDEX money_goods_payment_accepting_usr_idx ON money.goods_payment (accepting_usr);
561
562 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.goods_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('goods_payment');
563 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.goods_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('goods_payment');
564 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.goods_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('goods_payment');
565
566
567 CREATE TABLE money.bnm_desk_payment (
568         cash_drawer     INT     REFERENCES actor.workstation (id) DEFERRABLE INITIALLY DEFERRED
569 ) INHERITS (money.bnm_payment);
570 ALTER TABLE money.bnm_desk_payment ADD PRIMARY KEY (id);
571
572 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.bnm_desk_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('bnm_desk_payment');
573 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.bnm_desk_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('bnm_desk_payment');
574 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.bnm_desk_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('bnm_desk_payment');
575
576
577 CREATE OR REPLACE VIEW money.desk_payment_view AS
578         SELECT  p.*,c.relname AS payment_type
579           FROM  money.bnm_desk_payment p
580                 JOIN pg_class c ON (p.tableoid = c.oid);
581
582 CREATE OR REPLACE VIEW money.bnm_payment_view AS
583         SELECT  p.*,c.relname AS payment_type
584           FROM  money.bnm_payment p
585                 JOIN pg_class c ON (p.tableoid = c.oid);
586
587 CREATE TABLE money.cash_payment () INHERITS (money.bnm_desk_payment);
588 ALTER TABLE money.cash_payment ADD PRIMARY KEY (id);
589 CREATE INDEX money_cash_id_idx ON money.cash_payment (id);
590 CREATE INDEX money_cash_payment_xact_idx ON money.cash_payment (xact);
591 CREATE INDEX money_cash_payment_ts_idx ON money.cash_payment (payment_ts);
592 CREATE INDEX money_cash_payment_accepting_usr_idx ON money.cash_payment (accepting_usr);
593 CREATE INDEX money_cash_payment_cash_drawer_idx ON money.cash_payment (cash_drawer);
594
595 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.cash_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('bnm_payment');
596 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.cash_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('bnm_payment');
597 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.cash_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('bnm_payment');
598
599
600 CREATE TABLE money.check_payment (
601         check_number    TEXT    NOT NULL
602 ) INHERITS (money.bnm_desk_payment);
603 ALTER TABLE money.check_payment ADD PRIMARY KEY (id);
604 CREATE INDEX money_check_payment_xact_idx ON money.check_payment (xact);
605 CREATE INDEX money_check_id_idx ON money.check_payment (id);
606 CREATE INDEX money_check_payment_ts_idx ON money.check_payment (payment_ts);
607 CREATE INDEX money_check_payment_accepting_usr_idx ON money.check_payment (accepting_usr);
608 CREATE INDEX money_check_payment_cash_drawer_idx ON money.check_payment (cash_drawer);
609
610 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.check_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('bnm_payment');
611 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.check_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('bnm_payment');
612 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.check_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('bnm_payment');
613
614
615 CREATE TABLE money.credit_card_payment (
616         cc_type         TEXT,
617         cc_number       TEXT,
618         expire_month    INT,
619         expire_year     INT,
620         approval_code   TEXT
621 ) INHERITS (money.bnm_desk_payment);
622 ALTER TABLE money.credit_card_payment ADD PRIMARY KEY (id);
623 CREATE INDEX money_credit_card_payment_xact_idx ON money.credit_card_payment (xact);
624 CREATE INDEX money_credit_card_id_idx ON money.credit_card_payment (id);
625 CREATE INDEX money_credit_card_payment_ts_idx ON money.credit_card_payment (payment_ts);
626 CREATE INDEX money_credit_card_payment_accepting_usr_idx ON money.credit_card_payment (accepting_usr);
627 CREATE INDEX money_credit_card_payment_cash_drawer_idx ON money.credit_card_payment (cash_drawer);
628
629 CREATE TRIGGER mat_summary_add_tgr AFTER INSERT ON money.credit_card_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_add ('credit_card_payment');
630 CREATE TRIGGER mat_summary_upd_tgr AFTER UPDATE ON money.credit_card_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_update ('credit_card_payment');
631 CREATE TRIGGER mat_summary_del_tgr BEFORE DELETE ON money.credit_card_payment FOR EACH ROW EXECUTE PROCEDURE money.materialized_summary_payment_del ('credit_card_payment');
632
633
634 CREATE OR REPLACE VIEW money.non_drawer_payment_view AS
635         SELECT  p.*, c.relname AS payment_type
636           FROM  money.bnm_payment p         
637                         JOIN pg_class c ON p.tableoid = c.oid
638           WHERE c.relname NOT IN ('cash_payment','check_payment','credit_card_payment');
639
640 CREATE OR REPLACE VIEW money.cashdrawer_payment_view AS
641         SELECT  ou.id AS org_unit,
642                 ws.id AS cashdrawer,
643                 t.payment_type AS payment_type,
644                 p.payment_ts AS payment_ts,
645                 p.amount AS amount,
646                 p.voided AS voided,
647                 p.note AS note
648           FROM  actor.org_unit ou
649                 JOIN actor.workstation ws ON (ou.id = ws.owning_lib)
650                 LEFT JOIN money.bnm_desk_payment p ON (ws.id = p.cash_drawer)
651                 LEFT JOIN money.payment_view t ON (p.id = t.id);
652
653
654 COMMIT;
655