From 71bc6080b2913ae134d069f5257bc9c6cc4b9da8 Mon Sep 17 00:00:00 2001 From: miker Date: Wed, 10 Feb 2010 21:45:59 +0000 Subject: [PATCH] backend to support collection of patron purchase request data; create holds, when requested, from purchase requests at acqli->bre vivication time git-svn-id: svn://svn.open-ils.org/ILS/trunk@15498 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/examples/fm_IDL.xml | 69 +++++++++++++++++++ .../perlmods/OpenILS/Application/Acq/Order.pm | 51 +++++++++++++- Open-ILS/src/sql/Pg/002.schema.config.sql | 2 +- Open-ILS/src/sql/Pg/200.schema.acq.sql | 45 ++++++++++++ .../0159.schema.acq.patron_requests.sql | 49 +++++++++++++ 5 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/0159.schema.acq.patron_requests.sql diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index f182989c32..b76e3b4db6 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -4309,6 +4309,75 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm index 34b327ac6c..32221a40a8 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm @@ -197,7 +197,56 @@ sub update_lineitem { $li->edit_time('now'); $li->editor($mgr->editor->requestor->id); $mgr->add_li; - return $li if $mgr->editor->update_acq_lineitem($li); + my $success = $mgr->editor->update_acq_lineitem($li); + + if ($success) { # check for requests, create holds + my $requests = $mgr->editor->search_acq_user_request( + { lineitem => $li->id, + '-or' => + [ { need_before => {'>' => 'now'} }, + { need_before => undef } + ] + } + ); + + for my $request ( @$requests ) { + + $request->eg_bib( $li->eg_bib_id ); + $mgr->editor->update_acq_user_request( $request ); + + next unless ($U->is_true( $request->hold )); + + my $hold = Fieldmapper::action::hold_request->new; + $hold->usr( $request->usr ); + $hold->requestor( $request->usr ); + $hold->request_time( $request->request_date ); + $hold->pickup_lib( $request->pickup_lib ); + $hold->request_lib( $request->pickup_lib ); + $hold->selection_ou( $request->pickup_lib ); + $hold->phone_notify( $request->phone_notify ); + $hold->email_notify( $request->email_notify ); + $hold->expire_time( $request->need_before ); + + if ($request->holdable_formats) { + my $mrm = $mgr->editor->search_metabib_metarecord_source_map( { source => $li->eg_bib_id } )->[0]; + if ($mrm) { + $hold->hold_type( 'M' ); + $hold->holdable_formats( $request->holdable_formats ); + $hold->target( $mrm->metarecord ); + } + } + + if (!$hold->target) { + $hold->hold_type( 'T' ); + $hold->target( $li->eg_bib_id ); + } + + $mgr->editor->create_actor_hold_request( $hold ); + } + + return $li; + } + return undef; } diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index 29841912c4..ace790531d 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -51,7 +51,7 @@ CREATE TABLE config.upgrade_log ( install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); -INSERT INTO config.upgrade_log (version) VALUES ('0158'); -- atz +INSERT INTO config.upgrade_log (version) VALUES ('0159'); -- miker CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/200.schema.acq.sql b/Open-ILS/src/sql/Pg/200.schema.acq.sql index be898cbe4e..fb7a9d415b 100644 --- a/Open-ILS/src/sql/Pg/200.schema.acq.sql +++ b/Open-ILS/src/sql/Pg/200.schema.acq.sql @@ -688,6 +688,51 @@ CREATE INDEX acq_attribution_debit_idx CREATE INDEX acq_attribution_credit_idx ON acq.debit_attribution( funding_source_credit ); + +-- Patron requests +CREATE TABLE acq.user_request_type ( + id SERIAL PRIMARY KEY, + label TEXT NOT NULL UNIQUE -- i18n-ize +); + +INSERT INTO acq.user_request_type (id,label) VALUES (1, oils_i18n_gettext('1', 'Books', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (2, oils_i18n_gettext('2', 'Journal/Magazine & Newspaper Articles', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (3, oils_i18n_gettext('3', 'Audiobooks', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (4, oils_i18n_gettext('4', 'Music', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (5, oils_i18n_gettext('5', 'DVDs', 'aurt', 'label')); + +SELECT SETVAL('acq.user_request_type_id_seq'::TEXT, 6); + +CREATE TABLE acq.user_request ( + id SERIAL PRIMARY KEY, + usr INT NOT NULL REFERENCES actor.usr (id), -- requesting user + hold BOOL NOT NULL DEFAULT TRUE, + + pickup_lib INT NOT NULL REFERENCES actor.org_unit (id), -- pickup lib + holdable_formats TEXT, -- nullable, for use in hold creation + phone_notify TEXT, + email_notify BOOL NOT NULL DEFAULT TRUE, + lineitem INT REFERENCES acq.lineitem (id) ON DELETE CASCADE, + eg_bib BIGINT REFERENCES biblio.record_entry (id) ON DELETE CASCADE, + request_date TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- when they requested it + need_before TIMESTAMPTZ, -- don't create holds after this + max_fee TEXT, + + request_type INT NOT NULL REFERENCES acq.user_request_type (id), + isxn TEXT, + title TEXT, + volume TEXT, + author TEXT, + article_title TEXT, + article_pages TEXT, + publisher TEXT, + location TEXT, + pubdate TEXT, + mentioned TEXT, + other_info TEXT +); + + -- Functions CREATE TYPE acq.flat_lineitem_holding_subfield AS (lineitem int, holding int, subfield text, data text); diff --git a/Open-ILS/src/sql/Pg/upgrade/0159.schema.acq.patron_requests.sql b/Open-ILS/src/sql/Pg/upgrade/0159.schema.acq.patron_requests.sql new file mode 100644 index 0000000000..7a13181da3 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0159.schema.acq.patron_requests.sql @@ -0,0 +1,49 @@ +BEGIN; + +INSERT INTO config.upgrade_log (version) VALUES ('0159'); -- miker + +CREATE TABLE acq.user_request_type ( + id SERIAL PRIMARY KEY, + label TEXT NOT NULL UNIQUE -- i18n-ize +); + +INSERT INTO acq.user_request_type (id,label) VALUES (1, oils_i18n_gettext('1', 'Books', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (2, oils_i18n_gettext('2', 'Journal/Magazine & Newspaper Articles', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (3, oils_i18n_gettext('3', 'Audiobooks', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (4, oils_i18n_gettext('4', 'Music', 'aurt', 'label')); +INSERT INTO acq.user_request_type (id,label) VALUES (5, oils_i18n_gettext('5', 'DVDs', 'aurt', 'label')); + +SELECT SETVAL('acq.user_request_type_id_seq'::TEXT, 6); + +CREATE TABLE acq.user_request ( + id SERIAL PRIMARY KEY, + usr INT NOT NULL REFERENCES actor.usr (id), -- requesting user + hold BOOL NOT NULL DEFAULT TRUE, + + pickup_lib INT NOT NULL REFERENCES actor.org_unit (id), -- pickup lib + holdable_formats TEXT, -- nullable, for use in hold creation + phone_notify TEXT, + email_notify BOOL NOT NULL DEFAULT TRUE, + lineitem INT REFERENCES acq.lineitem (id) ON DELETE CASCADE, + eg_bib BIGINT REFERENCES biblio.record_entry (id) ON DELETE CASCADE, + request_date TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- when they requested it + need_before TIMESTAMPTZ, -- don't create holds after this + max_fee TEXT, + + request_type INT NOT NULL REFERENCES acq.user_request_type (id), + isxn TEXT, + title TEXT, + volume TEXT, + author TEXT, + article_title TEXT, + article_pages TEXT, + publisher TEXT, + location TEXT, + pubdate TEXT, + mentioned TEXT, + other_info TEXT +); + + +COMMIT; + -- 2.43.2