[open-ils-commits] [GIT] Evergreen ILS branch master updated. a5044ab62aa321b8bcafb346b55d13667e88c1f2

Evergreen Git git at git.evergreen-ils.org
Wed Dec 14 10:39:06 EST 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  a5044ab62aa321b8bcafb346b55d13667e88c1f2 (commit)
       via  2b106bccd4925eac180e9b1c48cf2d423d4a8aee (commit)
       via  0ed92e5fa45fa74a79ffe771b4c618391d39f3b8 (commit)
       via  b57c8a5a5782b085c12291cd43c8a39ce7842849 (commit)
       via  3ac16e523cad1cf05704b3e5fcee07504f7674b1 (commit)
      from  6349068fe22ff9431fca5ad9f1adadd6a5d0aea6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit a5044ab62aa321b8bcafb346b55d13667e88c1f2
Author: Thomas Berezansky <tsbere at mvlc.org>
Date:   Wed Dec 14 10:34:19 2011 -0500

    Stamping upgrade for LP898248: Address Alert
    
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index ac1f113..15a1cae 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -86,7 +86,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0656', :eg_version); -- dbs/berick
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0657', :eg_version); -- berick/tsbere
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql b/Open-ILS/src/sql/Pg/upgrade/0657.schema.address-alert.sql
similarity index 95%
rename from Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql
rename to Open-ILS/src/sql/Pg/upgrade/0657.schema.address-alert.sql
index aed3dce..d2dbb33 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/0657.schema.address-alert.sql
@@ -1,9 +1,9 @@
--- Evergreen DB patch XXXX.schema.address-alert.sql
+-- Evergreen DB patch 0657.schema.address-alert.sql
 --
 BEGIN;
 
 -- check whether patch can be applied
-SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+SELECT evergreen.upgrade_deps_block_check('0657', :eg_version);
 
 CREATE TABLE actor.address_alert (
     id              SERIAL  PRIMARY KEY,

commit 2b106bccd4925eac180e9b1c48cf2d423d4a8aee
Author: Bill Erickson <berick at esilibrary.com>
Date:   Fri Dec 9 15:52:32 2011 -0500

    Alert addresses for patron registration : UI
    
    Add support for comparing user addresses to alert addresses.  When an
    address is found, the address in question is styled (the header row
    turns red) and the configured alert message is shown along the
    top-right, where other warnings appear.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>

diff --git a/Open-ILS/src/templates/actor/user/register.tt2 b/Open-ILS/src/templates/actor/user/register.tt2
index 379405f..4e7c7fe 100644
--- a/Open-ILS/src/templates/actor/user/register.tt2
+++ b/Open-ILS/src/templates/actor/user/register.tt2
@@ -40,6 +40,11 @@
     <div><a href='javascript:void(0);' id='uedit-dupe-address-link'></a></div>
 </div>
 
+<div id='uedit-address-alert' class='hidden'>
+    <div id='uedit-address-alert-header'>[% l('Address Alert') %]</div>
+    <div id='uedit-address-alert-message'></div>
+</div>
+
 <div class='hidden'>
     <span id='true' style='color:green;'>&#x2713;</span>
     <span id='false' style='color:red;'>&#x2717;</span>
diff --git a/Open-ILS/web/css/skin/default/register.css b/Open-ILS/web/css/skin/default/register.css
index 2868ef4..582975b 100644
--- a/Open-ILS/web/css/skin/default/register.css
+++ b/Open-ILS/web/css/skin/default/register.css
@@ -43,6 +43,27 @@
     padding: 20px;
 }
 
+#uedit-address-alert {
+    position: fixed;
+    top:140px;
+    right:30px;
+    width:300px;
+    border:2px dashed #d9e8f9;
+    -moz-border-radius: 10px;
+    font-weight: bold;
+    padding: 10px;
+    text-align: center;
+}
+#uedit-address-alert-header { 
+    color: red; 
+    text-decoration: italic
+    text-align: center;
+}
+
+.uedit-address-alert-divider  {
+    border: 2px dashed red;
+}
+
 .uedit-help {
     width: 25px;
     border:1px solid #e0e0e0;
diff --git a/Open-ILS/web/js/ui/default/actor/user/register.js b/Open-ILS/web/js/ui/default/actor/user/register.js
index 56b7261..fffe460 100644
--- a/Open-ILS/web/js/ui/default/actor/user/register.js
+++ b/Open-ILS/web/js/ui/default/actor/user/register.js
@@ -48,10 +48,17 @@ var uEditCloneCopyAddr; // if true, copy addrs on clone instead of link
 var homeOuTypes = {};
 var cardPerms = {};
 var editCard;
+var prevBillingAddress;
+var prevMailingAddress;
 
 var dupeUsrname = false;
 var dupeBarcode = false;
 
+// allow for a pause after typing before sending address alert queries
+var addressAlertTimeout = 2000; 
+var addressAlertFields = 
+    ['street1', 'street2', 'city', 'state', 'county', 'country', 'post_code'];
+
 if(!window.xulG) var xulG = null;
 var lock_ready = false;
 var already_locked = false;
@@ -1261,50 +1268,131 @@ function attachWidgetEvents(fmcls, fmfield, widget) {
     }
 
     if(fmclass = 'aua') {
-        switch(fmfield) {
-            case 'post_code':
-                dojo.connect(widget.widget, 'onChange',
-                    function(e) { 
-                        fieldmapper.standardRequest(
-                            ['open-ils.search', 'open-ils.search.zip'],
-                            {   async: true,
-                                params: [e],
-                                oncomplete : function(r) {
-                                    var res = openils.Util.readResponse(r);
-                                    if(!res) return;
-                                    var callback = function(w) { return w._addr == widget._addr; };
-                                    if(res.city) findWidget('aua', 'city', callback).widget.attr('value', res.city);
-                                    if(res.state) findWidget('aua', 'state', callback).widget.attr('value', res.state);
-                                    if(res.county) findWidget('aua', 'county', callback).widget.attr('value', res.county);
-                                    if(res.alert) alert(res.alert);
-                                }
+
+        // map post code to city, state, and county
+        if (fmfield == 'post_code') {
+            dojo.connect(widget.widget, 'onChange',
+                function(e) { 
+                    fieldmapper.standardRequest(
+                        ['open-ils.search', 'open-ils.search.zip'],
+                        {   async: true,
+                            params: [e],
+                            oncomplete : function(r) {
+                                var res = openils.Util.readResponse(r);
+                                if(!res) return;
+                                var callback = function(w) { return w._addr == widget._addr; };
+                                if(res.city) findWidget('aua', 'city', callback).widget.attr('value', res.city);
+                                if(res.state) findWidget('aua', 'state', callback).widget.attr('value', res.state);
+                                if(res.county) findWidget('aua', 'county', callback).widget.attr('value', res.county);
+                                if(res.alert) alert(res.alert);
                             }
-                        );
-                    }
-                );
-                return;
+                        }
+                    );
+                }
+            );
+        }
 
-            case 'street1':
-            case 'street2':
-            case 'city':
-                dojo.connect(widget.widget, 'onChange',
-                    function(e) {
-                        var callback = function(w) { return w._addr == widget._addr; };
-                        var args = {
-                            street1 : findWidget('aua', 'street1', callback).widget.attr('value'),
-                            street2 : findWidget('aua', 'street2', callback).widget.attr('value'),
-                            city : findWidget('aua', 'city', callback).widget.attr('value'),
-                            post_code : findWidget('aua', 'post_code', callback).widget.attr('value')
-                        };
-                        if(args.street1 && args.city && args.post_code)
-                            uEditDupeSearch('address', args); 
-                    }
-                );
-                return;
+        // duplicate address search
+        if (['street1', 'street2', 'city'].indexOf(fmfield) > -1) {
+            dojo.connect(widget.widget, 'onChange',
+                function(e) {
+                    var callback = function(w) { return w._addr == widget._addr; };
+                    var args = {
+                        street1 : findWidget('aua', 'street1', callback).widget.attr('value'),
+                        street2 : findWidget('aua', 'street2', callback).widget.attr('value'),
+                        city : findWidget('aua', 'city', callback).widget.attr('value'),
+                        post_code : findWidget('aua', 'post_code', callback).widget.attr('value')
+                    };
+                    if(args.street1 && args.city && args.post_code)
+                        uEditDupeSearch('address', args); 
+                }
+            ); 
+        }
+
+        if (addressAlertFields.indexOf(fmfield) > -1) {
+            dojo.connect(
+                widget.widget, 'onChange', 
+                function() { uEditAddressAlertMarshal(widget._addr) }
+            );
         }
     }
 }
 
+function uEditAddressAlertMarshal(addrId, changeBilling, changeMailing) {
+
+    if (changeBilling) {
+        uEditAddressAlertMarshal(prevBillingAddress);
+        prevBillingAddress = addrId;
+    }
+    
+    if (changeMailing) {
+        uEditAddressAlertMarshal(prevMailingAddress);
+        prevMailingAddress = addrId;
+    }
+
+    var callback = function(w) { return w._addr == addrId; };
+    var args = {};
+    dojo.forEach(addressAlertFields,
+        function(field) {
+            args[field] = findWidget('aua', field, callback).widget.attr('value')
+        }
+    );
+    args.mailing_address = dojo.byId('uedit-mailing-address-' + addrId).checked;
+    args.billing_address = dojo.byId('uedit-billing-address-' + addrId).checked;
+    uEditAddressAlertSearch(args, addrId);
+}
+
+var _addrAlertTimeout = {};
+function uEditAddressAlertSearch(args, addrId) {
+
+    _addrAlertTimeout[addrId] = setTimeout(
+        function() {
+            if (_addrAlertTimeout[addrId]) 
+                clearTimeout(_addrAlertTimeout[addrId]);
+
+            console.log('creating addr alert search for ' + addrId);
+
+            fieldmapper.standardRequest(
+                ['open-ils.actor', 'open-ils.actor.address_alert.test'],
+                {   async: true,
+                    params: [openils.User.authtoken, staff.ws_ou(), args],
+                    oncomplete : function(r) {
+                        var alerts = openils.Util.readResponse(r);
+                        var msgNode = dojo.byId('uedit-address-alert-message');
+                        var headerRow = dojo.filter(
+                            dojo.query('[name=uedit-addr-divider]'),
+                            function(row) { return row.getAttribute('addr') == addrId })[0]
+
+                        msgNode.innerHTML = '';
+
+                        if (alerts.length) {
+
+                            // show the alert box
+                            openils.Util.hide('uedit-help-div');
+                            openils.Util.hide('uedit-dupe-div');
+                            openils.Util.show('uedit-address-alert');
+
+                            // style the address header row
+                            openils.Util.addCSSClass(headerRow, 'uedit-address-alert-divider');
+
+                            dojo.forEach(alerts,
+                                function(addr) {
+                                    msgNode.innerHTML += addr.alert_message() + '<br/>';
+                                }
+                            );
+
+                        } else { 
+                            openils.Util.hide('uedit-address-alert');
+                            openils.Util.removeCSSClass(headerRow, 'uedit-address-alert-divider');
+                        }
+                    }
+                }
+            );
+        }, 
+        addressAlertTimeout
+    );
+}
+
 function uEditDupeSearch(type, value) {
     if(!value) return;
     var search;
@@ -1360,6 +1448,7 @@ function uEditDupeSearch(type, value) {
                 if(resp && resp.length > 0) {
 
                     openils.Util.hide('uedit-help-div');
+                    openils.Util.hide('uedit-address-alert');
                     openils.Util.show('uedit-dupe-div');
                     var link;
 
@@ -1407,6 +1496,7 @@ function getByName(node, name) {
 
 function ueLoadContextHelp(fmcls, fmfield) {
     openils.Util.hide('uedit-dupe-div');
+    openils.Util.hide('uedit-dupe-div');
     openils.Util.show('uedit-help-div');
     dojo.byId('uedit-help-field').innerHTML = fieldmapper.IDL.fmclasses[fmcls].field_map[fmfield].label;
     dojo.byId('uedit-help-text').innerHTML = fieldDoc[fmcls][fmfield].string();
@@ -1720,15 +1810,22 @@ function uEditNewAddr(evt, id, mkLinks) {
                 // billing address
                 var ba = getByName(row, 'billing_address');
                 ba.id = 'uedit-billing-address-' + id;
-                if(mkLinks || (patron.billing_address() && patron.billing_address().id() == id))
+                if(mkLinks || (patron.billing_address() && patron.billing_address().id() == id)) {
                     ba.checked = true;
+                    prevBillingAddress = id;
+                }
 
                 // mailing address
                 var ma = getByName(row, 'mailing_address');
                 ma.id = 'uedit-mailing-address-' + id;
-                if(mkLinks || (patron.mailing_address() && patron.mailing_address().id() == id))
+                if(mkLinks || (patron.mailing_address() && patron.mailing_address().id() == id)) {
                     ma.checked = true;
+                    prevMailingAddress = id;
+                }
 
+                ba.onclick = function() { console.log('ba.onchange ' + id); uEditAddressAlertMarshal(id, true) };
+                ma.onclick = function() { uEditAddressAlertMarshal(id, false, true) };
+                
                 var btn = dojo.query('[name=delete-button]', row)[0];
                 if(btn) btn.onclick = function(){ uEditDeleteAddr(id) };
             }

commit 0ed92e5fa45fa74a79ffe771b4c618391d39f3b8
Author: Bill Erickson <berick at esilibrary.com>
Date:   Fri Dec 9 15:51:49 2011 -0500

    Alert addresses for patron registration : API
    
    Middle-layer API call for matching addresses to alert addresses
    
    open-ils.actor.address_alert.test(auth, orgid, fields)
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
index 03a20aa..c54debf 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
@@ -4363,5 +4363,50 @@ sub get_barcodes {
         return $db_result;
     }
 }
+__PACKAGE__->register_method(
+    method   => 'address_alert_test',
+    api_name => 'open-ils.actor.address_alert.test',
+    signature => {
+        desc => "Tests a set of address fields to determine if they match with an address_alert",
+        params => [
+            {desc => 'Authentication token', type => 'string'},
+            {desc => 'Org Unit',             type => 'number'},
+            {desc => 'Fields',               type => 'hash'},
+        ],
+        return => {desc => 'List of matching address_alerts'}
+    }
+);
+
+sub address_alert_test {
+    my ($self, $client, $auth, $org_unit, $fields) = @_;
+    return [] unless $fields and grep {$_} values %$fields;
+
+    my $e = new_editor(authtoken => $auth);
+    return $e->event unless $e->checkauth;
+    return $e->event unless $e->allowed('CREATE_USER', $org_unit);
+    $org_unit ||= $e->requestor->ws_ou;
+
+    my $alerts = $e->json_query({
+        from => [
+            'actor.address_alert_matches',
+            $org_unit,
+            $$fields{street1},
+            $$fields{street2},
+            $$fields{city},
+            $$fields{county},
+            $$fields{state},
+            $$fields{country},
+            $$fields{post_code},
+            $$fields{mailing_address},
+            $$fields{billing_address}
+        ]
+    });
+
+    # map the json_query hashes to real objects
+    return [
+        map {$e->retrieve_actor_address_alert($_)} 
+            (map {$_->{id}} @$alerts)
+    ];
+}
 
 1;

commit b57c8a5a5782b085c12291cd43c8a39ce7842849
Author: Bill Erickson <berick at esilibrary.com>
Date:   Fri Dec 9 10:43:28 2011 -0500

    Alert addresses for patron registration : configuration UI
    
    Conify UI for managing Alert Addresses
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>

diff --git a/Open-ILS/src/templates/conify/global/actor/address_alert.tt2 b/Open-ILS/src/templates/conify/global/actor/address_alert.tt2
new file mode 100644
index 0000000..6350530
--- /dev/null
+++ b/Open-ILS/src/templates/conify/global/actor/address_alert.tt2
@@ -0,0 +1,62 @@
+[% WRAPPER base.tt2 %]
+[% ctx.page_title = l('Address Alert') %]
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+    <div dojoType="dijit.layout.ContentPane" layoutAlign="top" class='oils-header-panel'>
+        <div>[% l('Address Alert') %]</div>
+        <div>
+            <button dojoType='dijit.form.Button' onClick='addrAlertGrid.showCreateDialog()'>[% l('New Address Alert') %]</button>
+            <button dojoType='dijit.form.Button' onClick='addrAlertGrid.deleteSelected()'>[% l('Delete Selected') %]</button>
+        </div>
+    </div>
+    <div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+        <span>[% l('Context Org Unit') %]</span>
+        <select dojoType="openils.widget.OrgUnitFilteringSelect"
+                jsId='contextOrgSelector'
+                searchAttr='shortname'
+                labelAttr='shortname'>
+        </select>
+    </div>
+    <div>
+        <p>
+            [% |l %]* Address Alert fields support regular expressions and are case-insensitive by default.[% END %]<br/>
+            <span class='pad-level-1'>[% |l %]* Example wildcard match:  742 Evergr.*n Terrace[% END %]</span><br/>
+            <span class='pad-level-1'>[% |l %]* Example case-sensitive match: (?c)742 Evergr.*n Terrace[% END %]</span><br/>
+            [% |l %]* If the billing or mailing address fields are selected, the tested address must be a billing or mailing address to match.[% END %]<br/>
+        </p>
+    </div>
+    <table  jsId="addrAlertGrid"
+            dojoType="openils.widget.AutoGrid"
+            fieldOrder="['owner', 'active', 'match_all', 'alert_message', 'street1', 'street2', 'city', 'county', 'state', 'country', 'post_code']"
+            query="{field: '*'}"
+            fmClass='aal'
+            autoHeight='true'
+            editOnEnter='true'>
+    </table>
+</div>
+
+<script type="text/javascript">
+    dojo.require('openils.Util');
+    dojo.require('openils.User');
+    dojo.require('openils.widget.AutoGrid');
+    dojo.require('openils.widget.OrgUnitFilteringSelect');
+
+    function loadGrid() {
+        var org = contextOrgSelector.attr('value');
+        addrAlertGrid.resetStore();
+        addrAlertGrid.loadAll({}, {owner : org}); 
+    }
+
+    openils.Util.addOnLoad( 
+        function() { 
+            new openils.User().buildPermOrgSelector('ADMIN_ADDRESS_ALERT', contextOrgSelector, null, 
+                function() {
+                    dojo.connect(contextOrgSelector, 'onChange', loadGrid);
+                    loadGrid();
+                }
+            );
+        } 
+    );
+</script>
+[% END %]
+
+
diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd
index 2ba73f7..e9a63bf 100644
--- a/Open-ILS/web/opac/locale/en-US/lang.dtd
+++ b/Open-ILS/web/opac/locale/en-US/lang.dtd
@@ -715,6 +715,7 @@
 <!ENTITY staff.main.menu.admin.local_admin.copy_template.accesskey "T">
 <!ENTITY staff.main.menu.admin.local_admin.patrons_due_refunds.label "Patrons with Negative Balances">
 <!ENTITY staff.main.menu.admin.local_admin.patrons_due_refunds.accesskey "N">
+<!ENTITY staff.main.menu.admin.local_admin.address_alert.label "Address Alerts">
 
 <!ENTITY staff.main.menu.admin.server_admin.label "Server Administration">
 <!ENTITY staff.main.menu.admin.server_admin.conify.org_unit_type.label "Organization Types">
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu.js b/Open-ILS/xul/staff_client/chrome/content/main/menu.js
index 65aa26c..fe93b18 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/menu.js
+++ b/Open-ILS/xul/staff_client/chrome/content/main/menu.js
@@ -1048,6 +1048,10 @@ main.menu.prototype = {
                 ['oncommand'],
                 function(event) { open_eg_web_page('conify/global/booking/resource_attr_map', null, event); }
             ],
+            'cmd_local_admin_address_alert' : [
+                ['oncommand'],
+                function(event) { open_eg_web_page('conify/global/actor/address_alert', null, event); }
+            ],
             'cmd_acq_create_invoice' : [
                 ['oncommand'],
                 function(event) { open_eg_web_page('acq/invoice/view?create=1', 'menu.cmd_acq_create_invoice.tab', event); }
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
index 4ec89a3..33b171a 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+++ b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
@@ -148,6 +148,9 @@
     <command id="cmd_local_admin_work_log" />
     <command id="cmd_local_admin_patrons_due_refunds" />
     <command id="cmd_local_admin_copy_template" />
+    <command id="cmd_local_admin_address_alert"
+             perm="ADMIN_ADDRESS_ALERT VIEW_ADDRESS_ALERT"
+             />
 
     <!-- server admin menu commands -->
     <command id="cmd_server_admin_org_type"
@@ -497,6 +500,7 @@
                 <menuitem label="&staff.main.menu.admin.local_admin.conify.survey.label;" command="cmd_local_admin_survey"/>
                 <menuitem label="&staff.server.admin.index.transit_list;" command="cmd_local_admin_transit_list"/>
                 <menuitem label="&staff.main.menu.admin.local_admin.work_log.label;" accesskey="&staff.main.menu.admin.local_admin.work_log.accesskey;" command="cmd_local_admin_work_log"/>
+                <menuitem label="&staff.main.menu.admin.local_admin.address_alert.label;" command="cmd_local_admin_address_alert"/>
             </menupopup>
         </menu>
         <menu id="main.menu.admin.server" label="&staff.main.menu.admin.server_admin.label;">

commit 3ac16e523cad1cf05704b3e5fcee07504f7674b1
Author: Bill Erickson <berick at esilibrary.com>
Date:   Tue Dec 6 16:09:16 2011 -0500

    Alert addresses for patron registration : DB/IDL
    
    DB and IDL components to support configuration of alert addresses.  The
    target use case for alert addresses is in the patron registration
    interface.  When a patron's address matches an alert address, the staff
    should be notified.
    
    Alert address fields are treated as regular expressions.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Thomas Berezansky <tsbere at mvlc.org>

diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml
index ec1cac6..ae72e81 100644
--- a/Open-ILS/examples/fm_IDL.xml
+++ b/Open-ILS/examples/fm_IDL.xml
@@ -3043,6 +3043,36 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 			<link field="replaces" reltype="has_a" key="id" map="" class="aua"/>
 		</links>
 	</class>
+	<class id="aal" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::address_alert" oils_persist:tablename="actor.address_alert" reporter:label="Address Alert">
+		<fields oils_persist:primary="id" oils_persist:sequence="actor.address_alert_id_seq">
+			<field reporter:label="Address Alert ID" name="id" reporter:datatype="id" />
+			<field reporter:label="Owner" name="owner" reporter:datatype="org_unit" oils_obj:required="true"/>
+			<field reporter:label="Active" name="active" reporter:datatype="bool"/>
+			<field reporter:label="Match All Fields" name="match_all" reporter:datatype="bool" />
+			<field reporter:label="Alert Message" name="alert_message" reporter:datatype="text" oils_obj:required="true"/>
+			<field reporter:label="Street (1)" name="street1"  reporter:datatype="text"/>
+			<field reporter:label="Street (2)" name="street2"  reporter:datatype="text"/>
+			<field reporter:label="City" name="city"  reporter:datatype="text"/>
+			<field reporter:label="County" name="county"  reporter:datatype="text"/>
+			<field reporter:label="State" name="state"  reporter:datatype="text"/>
+			<field reporter:label="Country" name="country"  reporter:datatype="text"/>
+			<field reporter:label="Postal Code" name="post_code" reporter:datatype="text"/>
+			<field reporter:label="Mailing Address" name="mailing_address" reporter:datatype="bool"/>
+			<field reporter:label="Billing Address" name="billing_address" reporter:datatype="bool"/>
+		</fields>
+		<links>
+			<link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create   context_field='owner' permission="ADMIN_ADDRESS_ALERT"/>
+				<retrieve context_field='owner' permission="ADMIN_ADDRESS_ALERT VIEW_ADDRESS_ALERT CREATE_USER"/>
+				<update   context_field='owner' permission="ADMIN_ADDRESS_ALERT"/>
+				<delete   context_field='owner' permission="ADMIN_ADDRESS_ALERT"/>
+			</actions>
+		</permacrud>
+	</class>
+
 
 	<class id="auss" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::usr_saved_search" oils_persist:tablename="actor.usr_saved_search" reporter:label="User Saved Search">
 		<fields oils_persist:primary="id" oils_persist:sequence="actor.usr_saved_search_id_seq">
diff --git a/Open-ILS/src/sql/Pg/005.schema.actors.sql b/Open-ILS/src/sql/Pg/005.schema.actors.sql
index 3f8fb92..3a9f841 100644
--- a/Open-ILS/src/sql/Pg/005.schema.actors.sql
+++ b/Open-ILS/src/sql/Pg/005.schema.actors.sql
@@ -605,4 +605,21 @@ CREATE TABLE actor.usr_saved_search (
 	CONSTRAINT name_once_per_user UNIQUE (owner, name)
 );
 
+CREATE TABLE actor.address_alert (
+    id              SERIAL  PRIMARY KEY,
+    owner           INT     NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+    active          BOOL    NOT NULL DEFAULT TRUE,
+    match_all       BOOL    NOT NULL DEFAULT TRUE,
+    alert_message   TEXT    NOT NULL,
+    street1         TEXT,
+    street2         TEXT,
+    city            TEXT,
+    county          TEXT,
+    state           TEXT,
+    country         TEXT,
+    post_code       TEXT,
+    mailing_address BOOL    NOT NULL DEFAULT FALSE,
+    billing_address BOOL    NOT NULL DEFAULT FALSE
+);
+
 COMMIT;
diff --git a/Open-ILS/src/sql/Pg/999.functions.global.sql b/Open-ILS/src/sql/Pg/999.functions.global.sql
index 4eff147..9885876 100644
--- a/Open-ILS/src/sql/Pg/999.functions.global.sql
+++ b/Open-ILS/src/sql/Pg/999.functions.global.sql
@@ -2035,3 +2035,53 @@ for my $key ( keys %map ) {
 return $default;
 
 $f$ LANGUAGE PLPERLU;
+
+CREATE OR REPLACE FUNCTION actor.address_alert_matches (
+        org_unit INT, 
+        street1 TEXT, 
+        street2 TEXT, 
+        city TEXT, 
+        county TEXT, 
+        state TEXT, 
+        country TEXT, 
+        post_code TEXT,
+        mailing_address BOOL DEFAULT FALSE,
+        billing_address BOOL DEFAULT FALSE
+    ) RETURNS SETOF actor.address_alert AS $$
+
+SELECT *
+FROM actor.address_alert
+WHERE
+    active
+    AND owner IN (SELECT id FROM actor.org_unit_ancestors($1)) 
+    AND (
+        (NOT mailing_address AND NOT billing_address)
+        OR (mailing_address AND $9)
+        OR (billing_address AND $10)
+    )
+    AND (
+            (
+                match_all
+                AND COALESCE($2, '') ~* COALESCE(street1,   '.*')
+                AND COALESCE($3, '') ~* COALESCE(street2,   '.*')
+                AND COALESCE($4, '') ~* COALESCE(city,      '.*')
+                AND COALESCE($5, '') ~* COALESCE(county,    '.*')
+                AND COALESCE($6, '') ~* COALESCE(state,     '.*')
+                AND COALESCE($7, '') ~* COALESCE(country,   '.*')
+                AND COALESCE($8, '') ~* COALESCE(post_code, '.*')
+            ) OR (
+                NOT match_all 
+                AND (  
+                       $2 ~* street1
+                    OR $3 ~* street2
+                    OR $4 ~* city
+                    OR $5 ~* county
+                    OR $6 ~* state
+                    OR $7 ~* country
+                    OR $8 ~* post_code
+                )
+            )
+        )
+    ORDER BY actor.org_unit_proximity(owner, $1)
+$$ LANGUAGE SQL;
+
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql
new file mode 100644
index 0000000..aed3dce
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.address-alert.sql
@@ -0,0 +1,79 @@
+-- Evergreen DB patch XXXX.schema.address-alert.sql
+--
+BEGIN;
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+CREATE TABLE actor.address_alert (
+    id              SERIAL  PRIMARY KEY,
+    owner           INT     NOT NULL REFERENCES actor.org_unit (id) DEFERRABLE INITIALLY DEFERRED,
+    active          BOOL    NOT NULL DEFAULT TRUE,
+    match_all       BOOL    NOT NULL DEFAULT TRUE,
+    alert_message   TEXT    NOT NULL,
+    street1         TEXT,
+    street2         TEXT,
+    city            TEXT,
+    county          TEXT,
+    state           TEXT,
+    country         TEXT,
+    post_code       TEXT,
+    mailing_address BOOL    NOT NULL DEFAULT FALSE,
+    billing_address BOOL    NOT NULL DEFAULT FALSE
+);
+
+CREATE OR REPLACE FUNCTION actor.address_alert_matches (
+        org_unit INT, 
+        street1 TEXT, 
+        street2 TEXT, 
+        city TEXT, 
+        county TEXT, 
+        state TEXT, 
+        country TEXT, 
+        post_code TEXT,
+        mailing_address BOOL DEFAULT FALSE,
+        billing_address BOOL DEFAULT FALSE
+    ) RETURNS SETOF actor.address_alert AS $$
+
+SELECT *
+FROM actor.address_alert
+WHERE
+    active
+    AND owner IN (SELECT id FROM actor.org_unit_ancestors($1)) 
+    AND (
+        (NOT mailing_address AND NOT billing_address)
+        OR (mailing_address AND $9)
+        OR (billing_address AND $10)
+    )
+    AND (
+            (
+                match_all
+                AND COALESCE($2, '') ~* COALESCE(street1,   '.*')
+                AND COALESCE($3, '') ~* COALESCE(street2,   '.*')
+                AND COALESCE($4, '') ~* COALESCE(city,      '.*')
+                AND COALESCE($5, '') ~* COALESCE(county,    '.*')
+                AND COALESCE($6, '') ~* COALESCE(state,     '.*')
+                AND COALESCE($7, '') ~* COALESCE(country,   '.*')
+                AND COALESCE($8, '') ~* COALESCE(post_code, '.*')
+            ) OR (
+                NOT match_all 
+                AND (  
+                       $2 ~* street1
+                    OR $3 ~* street2
+                    OR $4 ~* city
+                    OR $5 ~* county
+                    OR $6 ~* state
+                    OR $7 ~* country
+                    OR $8 ~* post_code
+                )
+            )
+        )
+    ORDER BY actor.org_unit_proximity(owner, $1)
+$$ LANGUAGE SQL;
+
+COMMIT;
+
+/* UNDO
+DROP FUNCTION actor.address_alert_matches(INT, TEXT, TEXT, TEXT, TEXT, TEXT, TEXT, TEXT, BOOL, BOOL);
+DROP TABLE actor.address_alert;
+*/

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/examples/fm_IDL.xml                       |   30 ++++
 .../src/perlmods/lib/OpenILS/Application/Actor.pm  |   45 +++++
 Open-ILS/src/sql/Pg/002.schema.config.sql          |    2 +-
 Open-ILS/src/sql/Pg/005.schema.actors.sql          |   17 ++
 Open-ILS/src/sql/Pg/999.functions.global.sql       |   50 ++++++
 .../sql/Pg/upgrade/0657.schema.address-alert.sql   |   79 +++++++++
 Open-ILS/src/templates/actor/user/register.tt2     |    5 +
 .../conify/global/actor/address_alert.tt2          |   62 +++++++
 Open-ILS/web/css/skin/default/register.css         |   21 +++
 Open-ILS/web/js/ui/default/actor/user/register.js  |  177 +++++++++++++++-----
 Open-ILS/web/opac/locale/en-US/lang.dtd            |    1 +
 .../xul/staff_client/chrome/content/main/menu.js   |    4 +
 .../chrome/content/main/menu_frame_menus.xul       |    4 +
 13 files changed, 456 insertions(+), 41 deletions(-)
 create mode 100644 Open-ILS/src/sql/Pg/upgrade/0657.schema.address-alert.sql
 create mode 100644 Open-ILS/src/templates/conify/global/actor/address_alert.tt2


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list