From 0456d89acfc9b0fc7c4928d3c0c74996d5085655 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Sun, 21 Oct 2018 20:10:19 -0400 Subject: [PATCH] LP#1714070 Patron parent/guardian field Adds a new dedicated patron parent/guardian field. This field is editable in the patron edit interface, displays in the patron summary side bar on the browser client, and is search-able from the patron search interface in the browser client. Adds patron editor "show" and "suggest" library settings. Also adds a new library setting 'ui.patron.edit.guardian_required_for_juv' ("GUI: Juvenile account requires parent/guardian"). When this setting is applied, a value will be required in the patron editor when the juvenile flag is active. Signed-off-by: Bill Erickson Signed-off-by: Kathy Lussier Signed-off-by: Jason Etheridge --- Open-ILS/examples/fm_IDL.xml | 1 + Open-ILS/src/sql/Pg/005.schema.actors.sql | 3 + Open-ILS/src/sql/Pg/950.data.seed-values.sql | 42 +++++ Open-ILS/src/sql/Pg/999.functions.global.sql | 1 + .../upgrade/XXXX.schema.patron-guardian.sql | 171 ++++++++++++++++++ .../templates/staff/circ/patron/t_edit.tt2 | 10 + .../templates/staff/circ/patron/t_summary.tt2 | 4 + .../staff/share/t_patron_search_form.tt2 | 16 +- .../js/ui/default/staff/circ/patron/regctl.js | 18 ++ 9 files changed, 260 insertions(+), 6 deletions(-) create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-guardian.sql diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index c883f47c86..1be2c885e8 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -3648,6 +3648,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + diff --git a/Open-ILS/src/sql/Pg/005.schema.actors.sql b/Open-ILS/src/sql/Pg/005.schema.actors.sql index 61d5baed27..c3879670b4 100644 --- a/Open-ILS/src/sql/Pg/005.schema.actors.sql +++ b/Open-ILS/src/sql/Pg/005.schema.actors.sql @@ -42,6 +42,7 @@ CREATE TABLE actor.usr ( second_given_name TEXT, family_name TEXT NOT NULL, suffix TEXT, + guardian TEXT, pref_prefix TEXT, pref_first_given_name TEXT, pref_second_given_name TEXT, @@ -93,6 +94,8 @@ CREATE INDEX actor_usr_first_given_name_unaccent_idx ON actor.usr (evergreen.una CREATE INDEX actor_usr_second_given_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(second_given_name)); CREATE INDEX actor_usr_family_name_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(family_name)); CREATE INDEX actor_usr_usrname_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(usrname)); +CREATE INDEX actor_usr_guardian_idx ON actor.usr (evergreen.lowercase(guardian)); +CREATE INDEX actor_usr_guardian_unaccent_idx ON actor.usr (evergreen.unaccent_and_squash(guardian)); CREATE INDEX actor_usr_pref_first_given_name_idx ON actor.usr (evergreen.lowercase(pref_first_given_name)); CREATE INDEX actor_usr_pref_second_given_name_idx ON actor.usr (evergreen.lowercase(pref_second_given_name)); diff --git a/Open-ILS/src/sql/Pg/950.data.seed-values.sql b/Open-ILS/src/sql/Pg/950.data.seed-values.sql index 949021b83d..e83dc04688 100644 --- a/Open-ILS/src/sql/Pg/950.data.seed-values.sql +++ b/Open-ILS/src/sql/Pg/950.data.seed-values.sql @@ -19414,4 +19414,46 @@ VALUES ( ); +INSERT into config.org_unit_setting_type (name, label, description, datatype) +VALUES ( + 'ui.patron.edit.au.guardian.show', + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.show', + 'GUI: Show guardian field on patron registration', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.show', + 'The guardian field will be shown on the patron registration screen. Showing a field makes it appear with required fields even when not required. If the field is required this setting is ignored.', + 'coust', 'description' + ), + 'bool' +), ( + 'ui.patron.edit.au.guardian.suggest', + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.suggest', + 'GUI: Suggest guardian field on patron registration', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.suggest', + 'The guardian field will be suggested on the patron registration screen. Suggesting a field makes it appear when suggested fields are shown. If the field is shown or required this setting is ignored.', + 'coust', 'description'), + 'bool' +), ( + 'ui.patron.edit.guardian_required_for_juv', + oils_i18n_gettext( + 'ui.patron.edit.guardian_required_for_juv', + 'GUI: Juvenile account requires parent/guardian', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.guardian_required_for_juv', + 'Require a value for the parent/guardian field in the patron editor for patrons marked as juvenile', + 'coust', 'description'), + 'bool' +); + + + diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql index 661ba4f257..388d10b101 100644 --- a/Open-ILS/src/sql/Pg/999.functions.global.sql +++ b/Open-ILS/src/sql/Pg/999.functions.global.sql @@ -831,6 +831,7 @@ BEGIN family_name = new_name, suffix = NULL, alias = NULL, + guardian = NULL, day_phone = NULL, evening_phone = NULL, other_phone = NULL, diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-guardian.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-guardian.sql new file mode 100644 index 0000000000..c63e1ceee8 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.patron-guardian.sql @@ -0,0 +1,171 @@ + +BEGIN; + +ALTER TABLE actor.usr ADD COLUMN guardian TEXT; + +CREATE INDEX actor_usr_guardian_idx + ON actor.usr (evergreen.lowercase(guardian)); +CREATE INDEX actor_usr_guardian_unaccent_idx + ON actor.usr (evergreen.unaccent_and_squash(guardian)); + +-- Modify auditor tables accordingly. +SELECT auditor.update_auditors(); + +-- clear the guardian field on delete +CREATE OR REPLACE FUNCTION actor.usr_delete( + src_usr IN INTEGER, + dest_usr IN INTEGER +) RETURNS VOID AS $$ +DECLARE + old_profile actor.usr.profile%type; + old_home_ou actor.usr.home_ou%type; + new_profile actor.usr.profile%type; + new_home_ou actor.usr.home_ou%type; + new_name text; + new_dob actor.usr.dob%type; +BEGIN + SELECT + id || '-PURGED-' || now(), + profile, + home_ou, + dob + INTO + new_name, + old_profile, + old_home_ou, + new_dob + FROM + actor.usr + WHERE + id = src_usr; + -- + -- Quit if no such user + -- + IF old_profile IS NULL THEN + RETURN; + END IF; + -- + perform actor.usr_purge_data( src_usr, dest_usr ); + -- + -- Find the root grp_tree and the root org_unit. This would be simpler if we + -- could assume that there is only one root. Theoretically, someday, maybe, + -- there could be multiple roots, so we take extra trouble to get the right ones. + -- + SELECT + id + INTO + new_profile + FROM + permission.grp_ancestors( old_profile ) + WHERE + parent is null; + -- + SELECT + id + INTO + new_home_ou + FROM + actor.org_unit_ancestors( old_home_ou ) + WHERE + parent_ou is null; + -- + -- Truncate date of birth + -- + IF new_dob IS NOT NULL THEN + new_dob := date_trunc( 'year', new_dob ); + END IF; + -- + UPDATE + actor.usr + SET + card = NULL, + profile = new_profile, + usrname = new_name, + email = NULL, + passwd = random()::text, + standing = DEFAULT, + ident_type = + ( + SELECT MIN( id ) + FROM config.identification_type + ), + ident_value = NULL, + ident_type2 = NULL, + ident_value2 = NULL, + net_access_level = DEFAULT, + photo_url = NULL, + prefix = NULL, + first_given_name = new_name, + guardian = NULL, + family_name = new_name, + suffix = NULL, + alias = NULL, + guardian = NULL, + day_phone = NULL, + evening_phone = NULL, + other_phone = NULL, + mailing_address = NULL, + billing_address = NULL, + home_ou = new_home_ou, + dob = new_dob, + active = FALSE, + master_account = DEFAULT, + super_user = DEFAULT, + barred = FALSE, + deleted = TRUE, + juvenile = DEFAULT, + usrgroup = 0, + claims_returned_count = DEFAULT, + credit_forward_balance = DEFAULT, + last_xact_id = DEFAULT, + alert_message = NULL, + create_date = now(), + expire_date = now() + WHERE + id = src_usr; +END; +$$ LANGUAGE plpgsql; + +INSERT into config.org_unit_setting_type (name, label, description, datatype) +VALUES ( + 'ui.patron.edit.au.guardian.show', + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.show', + 'GUI: Show guardian field on patron registration', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.show', + 'The guardian field will be shown on the patron registration screen. Showing a field makes it appear with required fields even when not required. If the field is required this setting is ignored.', + 'coust', 'description' + ), + 'bool' +), ( + 'ui.patron.edit.au.guardian.suggest', + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.suggest', + 'GUI: Suggest guardian field on patron registration', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.au.guardian.suggest', + 'The guardian field will be suggested on the patron registration screen. Suggesting a field makes it appear when suggested fields are shown. If the field is shown or required this setting is ignored.', + 'coust', 'description'), + 'bool' +), ( + 'ui.patron.edit.guardian_required_for_juv', + oils_i18n_gettext( + 'ui.patron.edit.guardian_required_for_juv', + 'GUI: Juvenile account requires parent/guardian', + 'coust', 'label' + ), + oils_i18n_gettext( + 'ui.patron.edit.guardian_required_for_juv', + 'Require a value for the parent/guardian field in the patron editor for patrons marked as juvenile', + 'coust', 'description'), + 'bool' +); + + +COMMIT; + diff --git a/Open-ILS/src/templates/staff/circ/patron/t_edit.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_edit.tt2 index 3f95036ce6..05e0d94947 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_edit.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_edit.tt2 @@ -393,6 +393,16 @@ within the "form" by name for validation. + + +
+ [% draw_field_label('au', 'guardian') %] + [% draw_form_input('au', 'guardian'); %] +
+ [% draw_example_text('au', 'guardian') %] +
+
+
diff --git a/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 index 6b16b66b10..11cf06a2b3 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 @@ -66,6 +66,10 @@
[% l('Date of Birth') %]
{{patron().dob() | date:$root.egDateFormat}}
+
+
[% l('Parent/Guardian') %]
+
{{patron().guardian()}}
+
[% l('Last Activity') %]
{{patron().usr_activity()[0].event_time() | date:$root.egDateFormat}}
diff --git a/Open-ILS/src/templates/staff/share/t_patron_search_form.tt2 b/Open-ILS/src/templates/staff/share/t_patron_search_form.tt2 index e9de36573a..dd1a9dc994 100644 --- a/Open-ILS/src/templates/staff/share/t_patron_search_form.tt2 +++ b/Open-ILS/src/templates/staff/share/t_patron_search_form.tt2 @@ -139,12 +139,8 @@
-
- -
+
@@ -164,6 +160,14 @@
+
+
+ +
+
diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js b/Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js index 75990209d8..cd8843a646 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js +++ b/Open-ILS/web/js/ui/default/staff/circ/patron/regctl.js @@ -391,6 +391,9 @@ angular.module('egCoreMod') 'ui.patron.edit.aua.post_code.regex', 'ui.patron.edit.aua.post_code.example', 'ui.patron.edit.aua.county.require', + 'ui.patron.edit.au.guardian.show', + 'ui.patron.edit.au.guardian.suggest', + 'ui.patron.edit.guardian_required_for_juv', 'format.date', 'ui.patron.edit.default_suggested', 'opac.barcode_regex', @@ -1365,6 +1368,10 @@ function($scope , $routeParams , $q , $uibModal , $window , egCore , apply_username_regex(); add_date_watchers(); + + if ($scope.org_settings['ui.patron.edit.guardian_required_for_juv']) { + add_juv_watcher(); + } }); function add_date_watchers() { @@ -1381,6 +1388,17 @@ function($scope , $routeParams , $q , $uibModal , $window , egCore , // No need to watch expire_date } + function add_juv_watcher() { + $scope.$watch('patron.juvenile', function(newVal, oldVal) { + if (newVal === oldVal) return; + if (newVal) { + field_visibility['au.guardian'] = 3; // required + } else { + // Value will be reassessed by show_field() + delete field_visibility['au.guardian']; + } + }); + } // update the currently displayed field documentation $scope.set_selected_field_doc = function(cls, field) { -- 2.43.2