SIP Export of Patron Stat Cats
authorThomas Berezansky <tsbere@mvlc.org>
Tue, 3 May 2011 16:23:44 +0000 (12:23 -0400)
committerThomas Berezansky <tsbere@mvlc.org>
Tue, 3 May 2011 17:02:03 +0000 (13:02 -0400)
Add support for the SIP Server to obtain patron stat information for export.

Signed-off-by: Thomas Berezansky <tsbere@mvlc.org>
Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/lib/OpenILS/Application/Circ/StatCat.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/CDBI/actor.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg/dbi.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Publisher/actor.pm
Open-ILS/src/perlmods/lib/OpenILS/SIP/Patron.pm
Open-ILS/src/sql/Pg/005.schema.actors.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql [new file with mode: 0644]
Open-ILS/web/opac/locale/en-US/lang.dtd
Open-ILS/xul/staff_client/server/admin/stat_cat_editor.js
Open-ILS/xul/staff_client/server/admin/stat_cat_editor.xhtml

index 724e8f5..7f60a27 100644 (file)
@@ -4366,6 +4366,19 @@ SELECT  usr,
                        <link field="usr" reltype="has_a" key="id" map="" class="au"/>
                </links>
        </class>
+    <class id="actscsf" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::stat_cat_sip_fields" oils_persist:tablename="actor.stat_cat_sip_fields" reporter:label="SIP Statistical Category Field Identifier">
+        <fields oils_persist:primary="field">
+            <field reporter:label="Field Identifier" name="field" reporter:datatype="text" reporter:selector="name"/>
+            <field reporter:label="Field Name" name="name" reporter:datatype="text"/>
+        </fields>
+        <links/>
+        <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+            <create permission="CREATE_PATRON_STAT_CAT" global_required="true"/>
+            <retrieve />
+            <update permission="UPDATE_PATRON_STAT_CAT" global_required="true"/>
+            <delete permission="DELETE_PATRON_STAT_CAT" global_required="true"/>
+        </permacrud>
+    </class>
        <class id="actsc" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="actor::stat_cat" oils_persist:tablename="actor.stat_cat" reporter:label="User Statistical Category">
                <fields oils_persist:primary="id" oils_persist:sequence="actor.stat_cat_id_seq">
                        <field reporter:label="Entries" name="entries" oils_persist:virtual="true" reporter:datatype="link"/>
@@ -4374,9 +4387,12 @@ SELECT  usr,
                        <field reporter:label="OPAC Visible" name="opac_visible" reporter:datatype="bool"/>
                        <field reporter:label="Owning Library" name="owner" reporter:datatype="org_unit"/>
                        <field reporter:label="User Summary" name="usr_summary" reporter:datatype="bool"/>
+                       <field reporter:label="SIP Field" name="sip_field" reporter:datatype="link"/>
+                       <field reporter:label="SIP Format" name="sip_format" reporter:datatype="text"/>
                </fields>
                <links>
                        <link field="owner" reltype="has_a" key="id" map="" class="aou"/>
+                       <link field="sip_field" reltype="has_a" key="field" map="" class="actscsf"/>
                        <link field="entries" reltype="has_many" key="stat_cat" map="" class="actsce"/>
                </links>
         <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
index 8ca8325..628e2c5 100644 (file)
@@ -88,6 +88,24 @@ sub retrieve_stat_cats {
        return [ sort { $a->name cmp $b->name } @$cats ];
 }
 
+__PACKAGE__->register_method (
+    method => "retrieve_stat_cat_sip_fields",
+    api_name => "open-ils.circ.stat_cat.actor.sip_fields.retrieve.all");
+
+sub retrieve_stat_cat_sip_fields {
+    my( $self, $client, $user_session ) = @_;
+
+    my $method = 'open-ils.storage.actor.stat_cat_sip_fields.retrieve.all.atomic';
+
+       my($user_obj, $evt) = $apputils->checkses($user_session); 
+    return $evt if $evt;
+
+       my $fields = $apputils->simple_scalar_request(
+                               "open-ils.storage", $method );
+
+    return $fields;
+}
+
 
 __PACKAGE__->register_method(
        method  => "retrieve_ranged_intersect_stat_cats",
index 392febe..28484a7 100644 (file)
@@ -118,7 +118,15 @@ use base qw/actor/;
 
 __PACKAGE__->table( 'actor_stat_cat' );
 __PACKAGE__->columns( Primary => qw/id/ );
-__PACKAGE__->columns( Essential => qw/owner name opac_visible usr_summary/ );
+__PACKAGE__->columns( Essential => qw/owner name opac_visible usr_summary sip_field sip_format/ );
+
+#-------------------------------------------------------------------------------
+package actor::stat_cat_sip_fields;
+use base qw/actor/;
+
+__PACKAGE__->table( 'actor_stat_cat_sip_fields' );
+__PACKAGE__->columns( Primary => qw/field/ );
+__PACKAGE__->columns( Essential => qw/name/ );
 
 #-------------------------------------------------------------------------------
 package actor::stat_cat_entry;
index 5c6990f..448d1f0 100644 (file)
        
        actor::stat_cat->table( 'actor.stat_cat' );
        actor::stat_cat->sequence( 'actor.stat_cat_id_seq' );
+
+       #---------------------------------------------------------------------
+       package actor::stat_cat_sip_fields;
        
+       actor::stat_cat_sip_fields->table( 'actor.stat_cat_sip_fields' );
+
        #---------------------------------------------------------------------
        package actor::stat_cat_entry;
        
index cd3d4b5..c7ff055 100644 (file)
@@ -1043,5 +1043,31 @@ __PACKAGE__->register_method(
         method          => 'ranged_actor_stat_cat_entry',
 );
 
+sub actor_stat_cat_sip_fields {
+    my $self = shift;
+    my $client = shift;
+    my $s_table = actor::stat_cat_sip_fields->table;
+
+    my $select = <<"        SQL";
+            SELECT field, name
+              FROM $s_table
+        SQL
+
+    my $sth = actor::stat_cat_sip_fields->db_Main->prepare_cached($select);
+    $sth->execute();
+
+    for my $scsf ( map { actor::stat_cat_sip_fields->construct($_) } $sth->fetchall_hash ) {
+        $client->respond( $scsf->to_fieldmapper );
+    }
+
+    return undef;
+}
+
+__PACKAGE__->register_method(
+    api_name    => 'open-ils.storage.actor.stat_cat_sip_fields.retrieve.all',
+    api_level   => 1,
+    stream      => 1,
+    method      => 'actor_stat_cat_sip_fields',
+);
 
 1;
index c628820..1d814e6 100644 (file)
@@ -66,6 +66,10 @@ sub new {
                 "billing_address",
                 "mailing_address",
                 'profile',
+                "stat_cat_entries",
+            ],
+            actscecm => [
+                "stat_cat",
             ],
         }
     };
@@ -721,5 +725,19 @@ sub inet_privileges {
     return $name;
 }
 
+sub extra_fields {
+    my( $self ) = @_;
+    my $extra_fields = {};
+       my $u = $self->{user};
+    foreach my $stat_cat_entry (@{$u->stat_cat_entries}) {
+        my $stat_cat = $stat_cat_entry->stat_cat;
+        next unless ($stat_cat->sip_field);
+        $extra_fields->{ $stat_cat->sip_field } = [] unless (defined $extra_fields->{$stat_cat->sip_field});
+        my $value = $stat_cat_entry->stat_cat_entry;
+        $value = sprintf($stat_cat->sip_format, $value) if (defined $stat_cat->sip_format);
+        push(@{$extra_fields->{ $stat_cat->sip_field}}, $value);
+    }
+    return $extra_fields;
+}
 
 1;
index f87ffa0..20059bc 100644 (file)
@@ -145,6 +145,16 @@ $$;
 
 CREATE INDEX actor_usr_setting_usr_idx ON actor.usr_setting (usr);
 
+CREATE TABLE actor.stat_cat_sip_fields (
+    field   CHAR(2) PRIMARY KEY,
+    name    TEXT    NOT NULL
+);
+COMMENT ON TABLE actor.stat_cat_sip_fields IS $$
+Actor Statistical Category SIP Fields
+
+Contains the list of valid SIP Field identifiers for
+Statistical Categories.
+$$;
 
 CREATE TABLE actor.stat_cat (
        id              SERIAL  PRIMARY KEY,
@@ -152,6 +162,8 @@ CREATE TABLE actor.stat_cat (
        name            TEXT    NOT NULL,
        opac_visible    BOOL NOT NULL DEFAULT FALSE,
        usr_summary     BOOL NOT NULL DEFAULT FALSE,
+    sip_field   CHAR(2) REFERENCES actor.stat_cat_sip_fields(field) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    sip_format  TEXT,
        CONSTRAINT sc_once_per_owner UNIQUE (owner,name)
 );
 COMMENT ON TABLE actor.stat_cat IS $$
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.sip_statcat.sql
new file mode 100644 (file)
index 0000000..fc6174b
--- /dev/null
@@ -0,0 +1,20 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('XXXX');
+
+CREATE TABLE actor.stat_cat_sip_fields (
+    field   CHAR(2) PRIMARY KEY,
+    name    TEXT    NOT NULL
+);
+COMMENT ON TABLE actor.stat_cat_sip_fields IS $$
+Actor Statistical Category SIP Fields
+
+Contains the list of valid SIP Field identifiers for
+Statistical Categories.
+$$;
+ALTER TABLE actor.stat_cat
+    ADD COLUMN sip_field   CHAR(2) REFERENCES actor.stat_cat_sip_fields(field) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+    ADD COLUMN sip_format  TEXT;
+
+COMMIT;
index 920db0d..8b42c30 100644 (file)
 <!ENTITY staff.server.admin.stat_cat.new_entry_name "Enter the value of the new entry: ">
 <!ENTITY staff.server.admin.stat_cat.new_entry_create "Create new entry">
 <!ENTITY staff.server.admin.stat_cat.update_success "Update succeeded">
+<!ENTITY staff.server.admin.stat_cat.sip_field "SIP Field: ">
+<!ENTITY staff.server.admin.stat_cat.sip_field.none "No SIP Export">
+<!ENTITY staff.server.admin.stat_cat.sip_format "SIP Format: ">
+<!ENTITY staff.server.admin.stat_cat.sip_field.label "SIP Field">
+<!ENTITY staff.server.admin.stat_cat.sip_format.label "SIP Format">
+<!ENTITY staff.server.admin.stat_cat.sip_field.none.label "No SIP">
 <!ENTITY staff.server.admin.upload_xacts.title "Upload Offline Transactions">
 <!ENTITY staff.server.admin.upload_xacts.header "Uploading transactions...">
 <!ENTITY staff.server.admin.upload_xacts.upload "Upload">
index 55bad58..661f42a 100644 (file)
@@ -1,4 +1,5 @@
 var SC_FETCH_ALL        = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.retrieve.all';
+var SC_FETCH_SF         = 'open-ils.circ:open-ils.circ.stat_cat.actor.sip_fields.retrieve.all';
 var SC_CREATE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.create';
 var SC_UPDATE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.update';
 var SC_DELETE            = 'open-ils.circ:open-ils.circ.stat_cat.TYPE.delete';
@@ -77,6 +78,23 @@ function scEditorInit() {
     if(!session) throw "User session is not defined";
     user = fetchUser(session);
     $('sc_type_selector').onchange = scBuildNew;
+    try {
+    var sipfieldselect1 = $('sc_sip_field');
+    var sipfieldselect2 = $n($('sc_edit_row'), 'sc_edit_sip_field');
+    var req = new Request( SC_FETCH_SF, session );
+    req.send(true);
+    var result = req.result();
+    for(var f in result) {
+        var option1 = document.createElement('option');
+        option1.value = result[f].field();
+        option1.appendChild(text(result[f].name() + ' (' + result[f].field() + ')'));
+        var option2 = option1.cloneNode(true);
+        sipfieldselect1.appendChild(option1);
+        sipfieldselect2.appendChild(option2);
+    }
+    } catch (E) { alert(js2JSON(E));}
+
+
     setTimeout( 
         function() { 
             fetchHighestWorkPermOrgs(
@@ -106,7 +124,6 @@ function scShow(type) {
 }
 
 function _scShow(type) { 
-
     currentlyVisible = type;
 
     if( type == ASSET ) {
@@ -142,10 +159,14 @@ function scDraw( type, cats ) {
 
     if(type == ACTOR) {
         unHideMe($('sc_usr_summary_label'));
+        unHideMe($('sc_sip_field_label'));
+        unHideMe($('sc_sip_format_label'));
         hideMe($('sc_required_label'));
     } else {
         unHideMe($('sc_required_label'));
         hideMe($('sc_usr_summary_label'));
+        hideMe($('sc_sip_field_label'));
+        hideMe($('sc_sip_format_label'));
     }
 
     scCounter = 0;
@@ -177,6 +198,15 @@ function scInsertCat( tbody, cat, type ) {
         else 
             unHideMe($n(row, 'sc_usr_summary'));
 
+        if(cat.sip_field().length != 2)
+            unHideMe($n(row, 'sc_sip_field_none'));
+        else {
+            $n(row, 'sc_sip_field_value').appendChild( text( cat.sip_field() ) );
+            unHideMe($n(row, 'sc_sip_field_value'));
+        }
+
+        $n(row, 'sc_sip_format_td').appendChild( text( cat.sip_format() ) );
+
         hideMe($n(row, 'sc_required_td'));
     } else {
         if(isTrue(cat.required()))
@@ -185,6 +215,8 @@ function scInsertCat( tbody, cat, type ) {
             unHideMe($n(row, 'sc_required'));
 
         hideMe($n(row, 'sc_usr_summary_td'));
+        hideMe($n(row, 'sc_sip_field_td'));
+        hideMe($n(row, 'sc_sip_format_td'));
     }
 
     tbody.appendChild(row);
@@ -285,10 +317,12 @@ function scBuildNew() {
             hideMe($('required_td2'));
             unHideMe($('usr_summary_td1'));
             unHideMe($('usr_summary_td2'));
+            unHideMe($('sip_tr'));
         break;
         case ASSET:
             hideMe($('usr_summary_td1'));
             hideMe($('usr_summary_td2'));
+            hideMe($('sip_tr'));
             unHideMe($('required_td1'));
             unHideMe($('required_td2'));
         break;
@@ -323,6 +357,10 @@ function scNew() {
     if( type == ACTOR ) {
         cat = new actsc();
         cat.usr_summary( usr_summary );
+        var field = getSelectorVal($('sc_sip_field'));
+        if(field.length == 2) cat.sip_field(field);
+        else cat.sip_field(null);
+        cat.sip_format($('sc_sip_format').value);
     }
     if( type == ASSET ) {
         cat = new asc();
@@ -359,12 +397,18 @@ function scEdit( tbody, type, cat ) {
     if(type == ACTOR) {
         var cb = $n(row, 'sc_edit_usr_summary');
         cb.checked = isTrue(cat.usr_summary()); 
+        setSelector($n(row, 'sc_edit_sip_field'), cat.sip_field());
+        $n(row, 'sc_edit_sip_format').value = cat.sip_format();
         hideMe($n(row, 'sc_edit_required_td'));
         unHideMe($n(row, 'sc_edit_usr_summary_td'));
+        unHideMe($n(row, 'sc_edit_sip_field_td'));
+        unHideMe($n(row, 'sc_edit_sip_format_td'));
     } else {
         var cb = $n(row, 'sc_edit_required');
         cb.checked = isTrue(cat.required()); 
         hideMe($n(row, 'sc_edit_usr_summary_td'));
+        hideMe($n(row, 'sc_edit_sip_field_td'));
+        hideMe($n(row, 'sc_edit_sip_format_td'));
         unHideMe($n(row, 'sc_edit_required_td'));
     }
 
@@ -425,11 +469,15 @@ function scEditGo( type, cat, row, selector ) {
 
     var usr_summary = $n(row, 'sc_edit_usr_summary').checked;
     var required = $n(row, 'sc_edit_required').checked;
+    var sip_field = getSelectorVal( $n(row, 'sc_edit_sip_field') );
 
     cat.name( name );
     cat.owner( newlib );
     cat.entries(null);
     cat.opac_visible(0);
+    if(sip_field.length == 2) cat.sip_field( sip_field );
+    else cat.sip_field(null);
+    cat.sip_format($n(row, 'sc_edit_sip_format').value);
     if( visible ) cat.opac_visible(1);
     switch(type) {
         case ACTOR:
index b468a97..4be121d 100644 (file)
                             <span>&staff.server.admin.stat_cat.off;</span>
                             <input type='radio' name='usr_summary' checked='checked'> </input>
                         </td>
-
+                    </tr>
+                    <tr id='sip_tr'>
+                        <td>&staff.server.admin.stat_cat.sip_field;</td>
+                        <td>
+                            <select name='sip_field' id='sc_sip_field'>
+                                <option value=''>&staff.server.admin.stat_cat.sip_field.none;</option>
+                            </select>
+                        </td>
+                        <td>&staff.server.admin.stat_cat.sip_format;</td>
+                        <td><input type='text' name='sip_format' id='sc_sip_format' /></td>
                     </tr>
                     <tr>
                         <td colspan='4'>
                             <td>&staff.server.admin.stat_cat.opac_visibility.label;</td>
                             <td id='sc_required_label'>&staff.server.admin.stat_cat.required.label;</td>
                             <td id='sc_usr_summary_label'>&staff.server.admin.stat_cat.usr_summary.label;</td>
+                            <td id='sc_sip_field_label'>&staff.server.admin.stat_cat.sip_field.label;</td>
+                            <td id='sc_sip_format_label'>&staff.server.admin.stat_cat.sip_format.label;</td>
                             <td>&staff.server.admin.stat_cat.entries.label;</td>
                             <td>&staff.server.admin.stat_cat.add_entry;</td>
                             <td>&staff.server.admin.stat_cat.edit;</td>
                                 <span class='hide_me' name='sc_usr_summary_on'>&staff.server.admin.stat_cat.on;</span> 
                                 <span class='hide_me' name='sc_usr_summary'>&staff.server.admin.stat_cat.off;</span> 
                             </td>
+                            <td name='sc_sip_field_td'>
+                                <span class='hide_me' name='sc_sip_field_none'>&staff.server.admin.stat_cat.sip_field.none.label;</span>
+                                <span class='hide_me' name='sc_sip_field_value' />
+                            </td>
+                            <td name='sc_sip_format_td'/>
                             <td>
                                 <select class='selector' name='sc_entries_selector'>
                                     <option>&staff.server.admin.stat_cat.none;</option>
                 <td name='sc_edit_usr_summary_td'>
                     <input type='checkbox' name='sc_edit_usr_summary'/>
                 </td>
+                <td name='sc_edit_sip_field_td'>
+                    <select name='sc_edit_sip_field'>
+                        <option value=''>&staff.server.admin.stat_cat.sip_field.none;</option>
+                    </select>
+                </td>
+                <td name='sc_edit_sip_format_td'>
+                    <input type='text' name='sc_edit_sip_format'/>
+                </td>
                 <td colspan='4'>
                     <span class='padded'>
                         <input  type='submit' value='&staff.server.admin.stat_cat.edit_submit;' name='sc_edit_submit'/>