1 DROP SCHEMA acq CASCADE;
11 CREATE TABLE acq.currency_type (
12 code TEXT PRIMARY KEY,
16 -- Use the ISO 4217 abbreviations for currency codes
17 INSERT INTO acq.currency_type (code, label) VALUES ('USD','US Dollars');
18 INSERT INTO acq.currency_type (code, label) VALUES ('CAN','Canadian Dollars');
19 INSERT INTO acq.currency_type (code, label) VALUES ('EUR','Euros');
21 CREATE TABLE acq.exchange_rate (
22 id SERIAL PRIMARY KEY,
23 from_currency TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
24 to_currency TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
25 ratio NUMERIC NOT NULL,
26 CONSTRAINT exchange_rate_from_to_once UNIQUE (from_currency,to_currency)
29 INSERT INTO acq.exchange_rate (from_currency,to_currency,ratio) VALUES ('USD','CAN',1.2);
30 INSERT INTO acq.exchange_rate (from_currency,to_currency,ratio) VALUES ('USD','EUR',0.5);
32 CREATE TABLE acq.provider (
33 id SERIAL PRIMARY KEY,
35 owner INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
36 currency_type TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
39 CONSTRAINT provider_name_once_per_owner UNIQUE (name,owner)
42 CREATE TABLE acq.provider_holding_subfield_map (
43 id SERIAL PRIMARY KEY,
44 provider INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
45 name TEXT NOT NULL, -- barcode, price, etc
46 subfield TEXT NOT NULL,
47 CONSTRAINT name_once_per_provider UNIQUE (provider,name)
50 CREATE TABLE acq.provider_address (
51 id SERIAL PRIMARY KEY,
52 valid BOOL NOT NULL DEFAULT TRUE,
54 provider INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
55 street1 TEXT NOT NULL,
60 country TEXT NOT NULL,
61 post_code TEXT NOT NULL
64 CREATE TABLE acq.provider_contact (
65 id SERIAL PRIMARY KEY,
66 provider INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
68 role TEXT, -- free-form.. e.g. "our sales guy"
73 CREATE TABLE acq.provider_contact_address (
74 id SERIAL PRIMARY KEY,
75 valid BOOL NOT NULL DEFAULT TRUE,
77 contact INT NOT NULL REFERENCES acq.provider_contact (id) DEFERRABLE INITIALLY DEFERRED,
78 street1 TEXT NOT NULL,
83 country TEXT NOT NULL,
84 post_code TEXT NOT NULL
88 CREATE TABLE acq.funding_source (
89 id SERIAL PRIMARY KEY,
91 owner INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
92 currency_type TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
94 CONSTRAINT funding_source_name_once_per_owner UNIQUE (name,owner)
97 CREATE TABLE acq.funding_source_credit (
98 id SERIAL PRIMARY KEY,
99 funding_source INT NOT NULL REFERENCES acq.funding_source (id) DEFERRABLE INITIALLY DEFERRED,
100 amount NUMERIC NOT NULL,
104 CREATE TABLE acq.fund (
105 id SERIAL PRIMARY KEY,
106 org INT NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
108 year INT NOT NULL DEFAULT EXTRACT( YEAR FROM NOW() ),
109 currency_type TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
111 CONSTRAINT name_once_per_org_year UNIQUE (org,name,year)
114 CREATE TABLE acq.fund_debit (
115 id SERIAL PRIMARY KEY,
116 fund INT NOT NULL REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED,
117 origin_amount NUMERIC NOT NULL, -- pre-exchange-rate amount
118 origin_currency_type TEXT NOT NULL REFERENCES acq.currency_type (code) DEFERRABLE INITIALLY DEFERRED,
119 amount NUMERIC NOT NULL,
120 encumbrance BOOL NOT NULL DEFAULT TRUE,
121 debit_type TEXT NOT NULL,
122 xfer_destination INT REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED
125 CREATE TABLE acq.fund_allocation (
126 id SERIAL PRIMARY KEY,
127 funding_source INT NOT NULL REFERENCES acq.funding_source (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
128 fund INT NOT NULL REFERENCES acq.fund (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
130 percent NUMERIC CHECK (percent IS NULL OR percent BETWEEN 0.0 AND 100.0),
131 allocator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
133 CONSTRAINT allocation_amount_or_percent CHECK ((percent IS NULL AND amount IS NOT NULL) OR (percent IS NOT NULL AND amount IS NULL))
137 CREATE TABLE acq.picklist (
138 id SERIAL PRIMARY KEY,
139 owner INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
140 creator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
141 editor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
142 org_unit INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
144 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
145 edit_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
146 CONSTRAINT name_once_per_owner UNIQUE (name,owner)
149 CREATE TABLE acq.purchase_order (
150 id SERIAL PRIMARY KEY,
151 owner INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
152 creator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
153 editor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
154 ordering_agency INT NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
155 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
156 edit_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
157 provider INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
158 state TEXT NOT NULL DEFAULT 'new'
160 CREATE INDEX po_owner_idx ON acq.purchase_order (owner);
161 CREATE INDEX po_provider_idx ON acq.purchase_order (provider);
162 CREATE INDEX po_state_idx ON acq.purchase_order (state);
164 CREATE TABLE acq.po_note (
165 id SERIAL PRIMARY KEY,
166 purchase_order INT NOT NULL REFERENCES acq.purchase_order (id) DEFERRABLE INITIALLY DEFERRED,
167 creator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
168 editor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
169 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
170 edit_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
173 CREATE INDEX po_note_po_idx ON acq.po_note (purchase_order);
175 CREATE TABLE acq.lineitem (
176 id BIGSERIAL PRIMARY KEY,
177 creator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
178 editor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
179 selector INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
180 provider INT REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED,
181 purchase_order INT REFERENCES acq.purchase_order (id) DEFERRABLE INITIALLY DEFERRED,
182 picklist INT REFERENCES acq.picklist (id) DEFERRABLE INITIALLY DEFERRED,
183 expected_recv_time TIMESTAMP WITH TIME ZONE,
184 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
185 edit_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
187 eg_bib_id INT REFERENCES biblio.record_entry (id) DEFERRABLE INITIALLY DEFERRED,
189 item_count INT NOT NULL DEFAULT 0,
190 state TEXT NOT NULL DEFAULT 'new',
191 CONSTRAINT picklist_or_po CHECK (picklist IS NOT NULL OR purchase_order IS NOT NULL)
193 CREATE INDEX li_po_idx ON acq.lineitem (purchase_order);
194 CREATE INDEX li_pl_idx ON acq.lineitem (picklist);
196 CREATE TABLE acq.lineitem_note (
197 id SERIAL PRIMARY KEY,
198 lineitem INT NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
199 creator INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
200 editor INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED,
201 create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
202 edit_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
205 CREATE INDEX li_note_li_idx ON acq.lineitem_note (lineitem);
207 CREATE TABLE acq.lineitem_detail (
208 id BIGSERIAL PRIMARY KEY,
209 lineitem INT NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
210 fund INT REFERENCES acq.fund (id) DEFERRABLE INITIALLY DEFERRED,
211 fund_debit INT REFERENCES acq.fund_debit (id) DEFERRABLE INITIALLY DEFERRED,
212 eg_copy_id BIGINT REFERENCES asset.copy (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
216 circ_modifier TEXT REFERENCES config.circ_modifier (code) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
217 owning_lib INT REFERENCES actor.org_unit (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
218 location INT REFERENCES asset.copy_location (id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
219 recv_time TIMESTAMP WITH TIME ZONE
222 CREATE INDEX li_detail_li_idx ON acq.lineitem_detail (lineitem);
224 CREATE TABLE acq.lineitem_attr_definition (
225 id BIGSERIAL PRIMARY KEY,
227 description TEXT NOT NULL,
228 remove TEXT NOT NULL DEFAULT '',
229 ident BOOL NOT NULL DEFAULT FALSE
232 CREATE TABLE acq.lineitem_marc_attr_definition (
233 id BIGINT PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
235 ) INHERITS (acq.lineitem_attr_definition);
237 CREATE TABLE acq.lineitem_provider_attr_definition (
238 id BIGINT PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
240 provider INT NOT NULL REFERENCES acq.provider (id) DEFERRABLE INITIALLY DEFERRED
241 ) INHERITS (acq.lineitem_attr_definition);
243 CREATE TABLE acq.lineitem_generated_attr_definition (
244 id BIGINT PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
246 ) INHERITS (acq.lineitem_attr_definition);
248 CREATE TABLE acq.lineitem_usr_attr_definition (
249 id BIGINT PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq'),
250 usr INT NOT NULL REFERENCES actor.usr (id) DEFERRABLE INITIALLY DEFERRED
251 ) INHERITS (acq.lineitem_attr_definition);
253 CREATE TABLE acq.lineitem_local_attr_definition (
254 id BIGINT PRIMARY KEY DEFAULT NEXTVAL('acq.lineitem_attr_definition_id_seq')
255 ) INHERITS (acq.lineitem_attr_definition);
257 CREATE TABLE acq.lineitem_attr (
258 id BIGSERIAL PRIMARY KEY,
259 definition BIGINT NOT NULL,
260 lineitem BIGINT NOT NULL REFERENCES acq.lineitem (id) DEFERRABLE INITIALLY DEFERRED,
261 attr_type TEXT NOT NULL,
262 attr_name TEXT NOT NULL,
263 attr_value TEXT NOT NULL
266 CREATE INDEX li_attr_li_idx ON acq.lineitem_attr (lineitem);
267 CREATE INDEX li_attr_value_idx ON acq.lineitem_attr (attr_value);
268 CREATE INDEX li_attr_definition_idx ON acq.lineitem_attr (definition);
274 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('title','Title of work','//*[@tag="245"]/*[contains("abcmnopr",@code)]');
275 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('author','Author of work','//*[@tag="100" or @tag="110" or @tag="113"]/*[contains("ad",@code)]');
276 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('language','Lanuage of work','//*[@tag="240"]/*[@code="l"][1]');
277 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('pagination','Pagination','//*[@tag="300"]/*[@code="a"][1]');
278 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath, remove ) VALUES ('isbn','ISBN','//*[@tag="020"]/*[@code="a"]', $r$(?:-|\s.+$)$r$);
279 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath, remove ) VALUES ('issn','ISSN','//*[@tag="022"]/*[@code="a"]', $r$(?:-|\s.+$)$r$);
280 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('price','Price','//*[@tag="020" or @tag="022"]/*[@code="c"][1]');
281 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('identifier','Identifier','//*[@tag="001"]');
282 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('publisher','Publisher','//*[@tag="260"]/*[@code="b"][1]');
283 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('pubdate','Publication Date','//*[@tag="260"]/*[@code="c"][1]');
284 INSERT INTO acq.lineitem_marc_attr_definition ( code, description, xpath ) VALUES ('edition','Edition','//*[@tag="250"]/*[@code="a"][1]');
287 CREATE TABLE acq.distribution_formula (
288 id SERIAL PRIMARY KEY,
290 REFERENCES actor.org_unit(id) DEFERRABLE INITIALLY DEFERRED,
292 skip_count INT NOT NULL DEFAULT 0,
293 CONSTRAINT acqdf_name_once_per_owner UNIQUE (name, owner)
296 CREATE TABLE acq.distribution_formula_entry (
297 id SERIAL PRIMARY KEY,
298 formula INTEGER NOT NULL REFERENCES acq.distribution_formula(id)
300 DEFERRABLE INITIALLY DEFERRED,
301 position INTEGER NOT NULL,
302 item_count INTEGER NOT NULL,
303 owning_lib INTEGER REFERENCES actor.org_unit(id)
304 DEFERRABLE INITIALLY DEFERRED,
305 location INTEGER REFERENCES asset.copy_location(id),
306 CONSTRAINT acqdfe_lib_once_per_formula UNIQUE( formula, position ),
307 CONSTRAINT acqdfe_must_be_somewhere
308 CHECK( owning_lib IS NOT NULL OR location IS NOT NULL )
311 CREATE TABLE acq.fund_tag (
312 id SERIAL PRIMARY KEY,
314 REFERENCES actor.org_unit(id) DEFERRABLE INITIALLY DEFERRED,
316 CONSTRAINT acqft_tag_once_per_owner UNIQUE (name, owner)
319 CREATE TABLE acq.fund_tag_map (
320 id SERIAL PRIMARY KEY,
321 fund INTEGER NOT NULL REFERENCES acq.fund(id)
322 DEFERRABLE INITIALLY DEFERRED,
323 tag INTEGER REFERENCES acq.fund_tag(id)
325 DEFERRABLE INITIALLY DEFERRED,
326 CONSTRAINT acqftm_fund_once_per_tag UNIQUE( fund, tag )
331 CREATE TYPE acq.flat_lineitem_holding_subfield AS (lineitem int, holding int, subfield text, data text);
332 CREATE OR REPLACE FUNCTION acq.extract_holding_attr_table (lineitem int, tag text) RETURNS SETOF acq.flat_lineitem_holding_subfield AS $$
335 lida acq.flat_lineitem_holding_subfield%ROWTYPE;
338 SELECT COUNT(*) INTO counter
343 '//*[@tag="' || tag || '"]',
345 ) as t(i int,c text);
347 FOR i IN 1 .. counter LOOP
350 FROM ( SELECT id,i,t,v
355 '//*[@tag="' || tag || '"][position()=' || i || ']/*/@code|' ||
356 '//*[@tag="' || tag || '"][position()=' || i || ']/*[@code]',
358 ) as t(id int,t text,v text)
369 CREATE TYPE acq.flat_lineitem_detail AS (lineitem int, holding int, attr text, data text);
370 CREATE OR REPLACE FUNCTION acq.extract_provider_holding_data ( lineitem_i int ) RETURNS SETOF acq.flat_lineitem_detail AS $$
374 lida acq.flat_lineitem_detail%ROWTYPE;
376 SELECT provider INTO prov_i FROM acq.lineitem WHERE id = lineitem_i;
377 IF NOT FOUND THEN RETURN; END IF;
379 SELECT holding_tag INTO tag_t FROM acq.provider WHERE id = prov_i;
380 IF NOT FOUND OR tag_t IS NULL THEN RETURN; END IF;
387 FROM acq.extract_holding_attr_table( lineitem_i, tag_t ) h
388 JOIN acq.provider_holding_subfield_map a USING (subfield)
389 WHERE a.provider = prov_i
398 -- select * from acq.extract_provider_holding_data(699);
400 CREATE OR REPLACE FUNCTION public.extract_acq_marc_field ( BIGINT, TEXT, TEXT) RETURNS TEXT AS $$
401 SELECT public.extract_marc_field('acq.lineitem', $1, $2, $3);
405 CREATE OR REPLACE FUNCTION public.extract_bib_marc_field ( BIGINT, TEXT ) RETURNS TEXT AS $$
406 SELECT public.extract_marc_field('biblio.record_entry', $1, $2);
409 CREATE OR REPLACE FUNCTION public.extract_authority_marc_field ( BIGINT, TEXT ) RETURNS TEXT AS $$
410 SELECT public.extract_marc_field('authority.record_entry', $1, $2);
414 -- INSERT INTO acq.lineitem_provider_attr_definition ( provider, code, description, xpath ) VALUES (1,'price','Price','//*[@tag="020" or @tag="022"]/*[@code="a"][1]');
417 Suggested vendor fields:
425 CREATE OR REPLACE FUNCTION public.ingest_acq_marc ( ) RETURNS TRIGGER AS $$
433 FOR adef IN SELECT *,tableoid FROM acq.lineitem_attr_definition LOOP
435 SELECT relname::TEXT INTO atype FROM pg_class WHERE oid = adef.tableoid;
437 IF (atype NOT IN ('lineitem_usr_attr_definition','lineitem_local_attr_definition')) THEN
438 IF (atype = 'lineitem_provider_attr_definition') THEN
439 SELECT provider INTO prov FROM acq.lineitem_provider_attr_definition WHERE id = adef.id;
440 CONTINUE WHEN NEW.provider IS NULL OR prov <> NEW.provider;
443 IF (atype = 'lineitem_provider_attr_definition') THEN
444 SELECT xpath INTO xpath_string FROM acq.lineitem_provider_attr_definition WHERE id = adef.id;
445 ELSIF (atype = 'lineitem_marc_attr_definition') THEN
446 SELECT xpath INTO xpath_string FROM acq.lineitem_marc_attr_definition WHERE id = adef.id;
447 ELSIF (atype = 'lineitem_generated_attr_definition') THEN
448 SELECT xpath INTO xpath_string FROM acq.lineitem_generated_attr_definition WHERE id = adef.id;
451 SELECT extract_acq_marc_field(id, xpath_string, adef.remove) INTO value FROM acq.lineitem WHERE id = NEW.id;
453 IF (value IS NOT NULL AND value <> '') THEN
454 INSERT INTO acq.lineitem_attr (lineitem, definition, attr_type, attr_name, attr_value)
455 VALUES (NEW.id, adef.id, atype, adef.code, value);
466 CREATE OR REPLACE FUNCTION public.cleanup_acq_marc ( ) RETURNS TRIGGER AS $$
468 IF TG_OP = 'UPDATE' THEN
469 DELETE FROM acq.lineitem_attr
470 WHERE lineitem = OLD.id AND attr_type IN ('lineitem_provider_attr_definition', 'lineitem_marc_attr_definition','lineitem_generated_attr_definition');
473 DELETE FROM acq.lineitem_attr WHERE lineitem = OLD.id;
479 CREATE TRIGGER cleanup_lineitem_trigger
480 BEFORE UPDATE OR DELETE ON acq.lineitem
481 FOR EACH ROW EXECUTE PROCEDURE public.cleanup_acq_marc();
483 CREATE TRIGGER ingest_lineitem_trigger
484 AFTER INSERT OR UPDATE ON acq.lineitem
485 FOR EACH ROW EXECUTE PROCEDURE public.ingest_acq_marc();
487 CREATE OR REPLACE FUNCTION acq.exchange_ratio ( from_ex TEXT, to_ex TEXT ) RETURNS NUMERIC AS $$
491 IF from_ex = to_ex THEN
495 SELECT ratio INTO rat FROM acq.exchange_rate WHERE from_currency = from_ex AND to_currency = to_ex;
500 SELECT ratio INTO rat FROM acq.exchange_rate WHERE from_currency = to_ex AND to_currency = from_ex;
511 CREATE OR REPLACE FUNCTION acq.exchange_ratio ( TEXT, TEXT, NUMERIC ) RETURNS NUMERIC AS $$
512 SELECT $3 * acq.exchange_ratio($1, $2);
515 CREATE OR REPLACE VIEW acq.funding_source_credit_total AS
516 SELECT funding_source,
517 SUM(amount) AS amount
518 FROM acq.funding_source_credit
521 CREATE OR REPLACE VIEW acq.funding_source_allocation_total AS
522 SELECT funding_source,
523 SUM(amount)::NUMERIC(100,2) AS amount
525 SELECT funding_source,
526 SUM(a.amount)::NUMERIC(100,2) AS amount
527 FROM acq.fund_allocation a
528 WHERE a.percent IS NULL
531 SELECT funding_source,
532 SUM( (SELECT SUM(amount) FROM acq.funding_source_credit c WHERE c.funding_source = a.funding_source) * (a.percent/100.0) )::NUMERIC(100,2) AS amount
533 FROM acq.fund_allocation a
534 WHERE a.amount IS NULL
539 CREATE OR REPLACE VIEW acq.funding_source_balance AS
540 SELECT COALESCE(c.funding_source, a.funding_source) AS funding_source,
541 SUM(COALESCE(c.amount,0.0) - COALESCE(a.amount,0.0))::NUMERIC(100,2) AS amount
542 FROM acq.funding_source_credit_total c
543 FULL JOIN acq.funding_source_allocation_total a USING (funding_source)
546 CREATE OR REPLACE VIEW acq.fund_allocation_total AS
548 SUM(amount)::NUMERIC(100,2) AS amount
551 SUM(a.amount * acq.exchange_ratio(s.currency_type, f.currency_type))::NUMERIC(100,2) AS amount
552 FROM acq.fund_allocation a
553 JOIN acq.fund f ON (a.fund = f.id)
554 JOIN acq.funding_source s ON (a.funding_source = s.id)
555 WHERE a.percent IS NULL
559 SUM( (SELECT SUM(amount) FROM acq.funding_source_credit c WHERE c.funding_source = a.funding_source) * acq.exchange_ratio(s.currency_type, f.currency_type) * (a.percent/100.0) )::NUMERIC(100,2) AS amount
560 FROM acq.fund_allocation a
561 JOIN acq.fund f ON (a.fund = f.id)
562 JOIN acq.funding_source s ON (a.funding_source = s.id)
563 WHERE a.amount IS NULL
568 CREATE OR REPLACE VIEW acq.fund_debit_total AS
571 SUM(amount) AS amount
575 CREATE OR REPLACE VIEW acq.fund_encumbrance_total AS
577 SUM(amount) AS amount
578 FROM acq.fund_debit_total
579 WHERE encumbrance IS TRUE
582 CREATE OR REPLACE VIEW acq.fund_spent_total AS
584 SUM(amount) AS amount
585 FROM acq.fund_debit_total
586 WHERE encumbrance IS FALSE
589 CREATE OR REPLACE VIEW acq.fund_combined_balance AS
591 c.amount - COALESCE(d.amount,0.0) AS amount
592 FROM acq.fund_allocation_total c
593 LEFT JOIN acq.fund_debit_total d USING (fund);
595 CREATE OR REPLACE VIEW acq.fund_spent_balance AS
597 c.amount - COALESCE(d.amount,0.0) AS amount
598 FROM acq.fund_allocation_total c
599 LEFT JOIN acq.fund_spent_total d USING (fund);