Action for Backdating Already-Checked In Circs
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 30 Sep 2009 07:41:51 +0000 (07:41 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 30 Sep 2009 07:41:51 +0000 (07:41 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@14213 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/opac/locale/en-US/lang.dtd
Open-ILS/xul/staff_client/chrome/content/main/constants.js
Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.js [new file with mode: 0644]
Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.xul [new file with mode: 0644]
Open-ILS/xul/staff_client/server/circ/checkin.js
Open-ILS/xul/staff_client/server/circ/checkin.xul
Open-ILS/xul/staff_client/server/circ/checkin_overlay.xul
Open-ILS/xul/staff_client/server/circ/circ_brief.xul
Open-ILS/xul/staff_client/server/circ/util.js
Open-ILS/xul/staff_client/server/locale/en-US/circ.properties

index 796c266..629fbef 100644 (file)
 <!ENTITY staff.circ.checkin.submit.label 'Submit'>
 <!ENTITY staff.circ.checkin.submit.accesskey 'S'>
 
+<!ENTITY staff.circ.backdate_post_checkin.header 'Backdate'>
+<!ENTITY staff.circ.backdate_post_checkin.description 'Backdate Already-Checked-In Circulation'>
+<!ENTITY staff.circ.backdate_post_checkin.cancel_btn.label 'Cancel'>
+<!ENTITY staff.circ.backdate_post_checkin.cancel_btn.accesskey 'C'>
+<!ENTITY staff.circ.backdate_post_checkin.apply_btn.label 'Apply'>
+<!ENTITY staff.circ.backdate_post_checkin.apply_btn.accesskey 'A'>
+
 <!ENTITY staff.circ.renew.caption 'Renew'>
 <!ENTITY staff.circ.renew.scan.label 'Enter Barcode:'>
 <!ENTITY staff.circ.renew.scan.accesskey 'a'>
 <!ENTITY staff.circ.checkin_overlay.sel_last_patron.accesskey "R">
 <!ENTITY staff.circ.checkin_overlay.sel_edit.label "Edit Item Attributes">
 <!ENTITY staff.circ.checkin_overlay.sel_edit.accesskey "E">
+<!ENTITY staff.circ.checkin_overlay.sel_backdate.label "Backdate Post-Checkin">
+<!ENTITY staff.circ.checkin_overlay.sel_backdate.accesskey "B">
 <!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.label "Mark Item Damaged">
 <!ENTITY staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey "D">
 <!ENTITY staff.circ.checkin_overlay.sel_transit_abort.label "Abort Transit">
index 2348aa5..8be10a0 100644 (file)
@@ -187,6 +187,7 @@ const api = {
        'FM_CIRC_COUNT_RETRIEVE_VIA_USER.authoritative' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.checked_out.count.authoritative', 'cacheable' : true, 'ttl' : 60000 },
        'FM_CIRC_COUNT_RETRIEVE_VIA_COPY' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circulation.count' },
        'FM_CIRC_EDIT_DUE_DATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.circulation.due_date.update' },
+    'FM_CIRC_BACKDATE' : { 'app' : 'open-ils.circ', 'method' : 'open-ils.circ.post_checkin_backdate' },
        'FM_CIT_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.user.ident_types.retrieve', 'secure' : false },
        'FM_CITM_RETRIEVE' : { 'app' : 'open-ils.search', 'method' : 'open-ils.search.biblio.item_type_map.retrieve.all', 'secure' : false },
        'FM_CNAL_RETRIEVE' : { 'app' : 'open-ils.actor', 'method' : 'open-ils.actor.net_access_level.retrieve.all', 'secure' : false },
@@ -280,6 +281,7 @@ const urls = {
        'XUL_BIB_BRIEF' : '/xul/server/cat/bib_brief.xul',
        'XUL_BROWSER' : 'chrome://open_ils_staff_client/content/util/browser.xul',
        'XUL_CHECKIN' : '/xul/server/circ/checkin.xul',
+       'XUL_BACKDATE' : '/xul/server/circ/backdate_post_checkin.xul',
        'XUL_RENEW' : '/xul/server/circ/renew.xul',
        'XUL_CHECKOUT' : '/xul/server/circ/checkout.xul',
        'XUL_CIRC_BRIEF' : '/xul/server/circ/circ_brief.xul',
diff --git a/Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.js b/Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.js
new file mode 100644 (file)
index 0000000..aab214c
--- /dev/null
@@ -0,0 +1,81 @@
+var data; var error; 
+
+function $(id) { return document.getElementById(id); }
+
+function default_focus() { $('cancel_btn').focus(); } // parent interfaces often call this
+
+function backdate_post_checkin_init() {
+    try {
+
+        commonStrings = $('commonStrings');
+        circStrings = $('circStrings');
+
+        if (typeof JSAN == 'undefined') {
+            throw(
+                commonStrings.getString('common.jsan.missing')
+            );
+        }
+
+        JSAN.errorLevel = "die"; // none, warn, or die
+        JSAN.addRepository('..');
+
+               JSAN.use('OpenILS.data'); data = new OpenILS.data(); data.stash_retrieve();
+
+        JSAN.use('util.error'); error = new util.error();
+
+        JSAN.use('util.date');
+
+        $('checkin_effective_datepicker').value = util.date.formatted_date(new Date(),'%F');
+
+        $('circ_brief').setAttribute('src', urls.XUL_CIRC_BRIEF);
+        get_contentWindow($('circ_brief')).xulG = { 'circ_id' : xul_param('circ_id',{'modal_xulG':true}) };
+
+        /* set widget behavior */
+        $('cancel_btn').addEventListener(
+            'command', function() { window.close(); }, false
+        );
+        $('apply_btn').addEventListener(
+            'command', 
+            function() {
+                update_modal_xulG(
+                    {
+                        'backdate' : $('checkin_effective_datepicker').value,
+                        'proceed' : 1
+                    }
+                )
+                window.close();
+            }, 
+            false
+        );
+
+        $('checkin_effective_datepicker').addEventListener(
+            'change',
+            function(ev) {
+                try {
+                    if ( ev.target.dateValue > new Date() ) throw($('circStrings').getString('staff.circ.future_date'));
+                    if ( ev.target.value == util.date.formatted_date(new Date(),'%F') ) {
+                        $('apply_btn').disabled = true;
+                    } else {
+                        $('apply_btn').disabled = false;
+                    }
+                } catch(E) {
+                    dump('checkin:effective_date: ' + E + '\n');
+                    ev.target.disabled = true;
+                    ev.target.value = util.date.formatted_date(new Date(),'%F');
+                    ev.target.disabled = false;
+                    JSAN.use('util.sound'); var sound = new util.sound(); sound.bad();
+                    $('apply_btn').disabled = true;
+                }
+            },
+            false
+        );
+
+        default_focus();
+
+    } catch(E) {
+        var err_prefix = 'backdate_post_checkin.js -> backdate_post_checkin_init() : ';
+        if (error) error.standard_unexpected_error_alert(err_prefix,E); else alert(err_prefix + E);
+    }
+
+}
+
diff --git a/Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.xul b/Open-ILS/xul/staff_client/server/circ/backdate_post_checkin.xul
new file mode 100644 (file)
index 0000000..ffed058
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!-- Application: Evergreen Staff Client -->
+<!-- Dialog: Backdate circ post-checkin  -->
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- PRESENTATION -->
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="/xul/server/skin/global.css" type="text/css"?>
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- LOCALIZATION -->
+<!DOCTYPE window PUBLIC "" ""[
+       <!--#include virtual="/opac/locale/${locale}/lang.dtd"-->
+]>
+
+<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+<!-- OVERLAYS -->
+<?xul-overlay href="/xul/server/OpenILS/util_overlay.xul"?>
+
+<window id="backdate_post_checkin_win" 
+    onload="try { backdate_post_checkin_init(); font_helper(); persist_helper(); } catch(E) { alert(E); }"
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+    height="250" width="800" oils_perist="height width"
+    title="&staff.hold_list.cancel_hold_dialog.title;">
+
+       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+       <!-- BEHAVIOR -->
+       <script type="text/javascript">var myPackageDir = 'open_ils_staff_client'; var IAMXUL = true;</script>
+       <scripts id="openils_util_scripts"/>
+
+       <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
+       <script type="text/javascript" src="backdate_post_checkin.js"/>
+
+       <messagecatalog id="circStrings" src="/xul/server/locale/<!--#echo var='locale'-->/circ.properties" />
+
+       <!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
+       <!-- CONTENT -->
+    <dialogheader title="&staff.circ.backdate_post_checkin.header;" description="&staff.circ.backdate_post_checkin.description;" />
+    <iframe id="circ_brief" flex="1"/>
+    <hbox>
+        <label id="checkin_effective_date_label" value="&staff.circ.checkin_overlay.effective_date.label;" control="checkin_effective_datepicker" accesskey="&staff.circ.checkin_overlay.effective_date.accesskey;"/>
+        <datepicker id="checkin_effective_datepicker" type="popup" context="clipboard"/>
+        <spacer flex="1"/>
+        <button id="cancel_btn" label="&staff.circ.backdate_post_checkin.cancel_btn.label;" accesskey="&staff.circ.backdate_post_checkin.cancel_btn.accesskey;" />
+        <button id="apply_btn" disabled="true" label="&staff.circ.backdate_post_checkin.apply_btn.label;" accesskey="&staff.circ.backdate_post_checkin.apply_btn.accesskey;" />
+    </hbox>
+</window>
+
index 9307189..2ac9d2c 100644 (file)
@@ -52,6 +52,7 @@ circ.checkin.prototype = {
                                                obj.error.sdump('D_TRACE', 'circ/copy_status: selection list = ' + js2JSON(obj.selection_list) );
                                                if (obj.selection_list.length == 0) {
                                                        obj.controller.view.sel_edit.setAttribute('disabled','true');
+                                                       obj.controller.view.sel_backdate.setAttribute('disabled','true');
                                                        obj.controller.view.sel_opac.setAttribute('disabled','true');
                                                        obj.controller.view.sel_patron.setAttribute('disabled','true');
                                                        obj.controller.view.sel_last_patron.setAttribute('disabled','true');
@@ -63,6 +64,7 @@ circ.checkin.prototype = {
                                                        obj.controller.view.sel_mark_items_damaged.setAttribute('disabled','true');
                                                } else {
                                                        obj.controller.view.sel_edit.setAttribute('disabled','false');
+                                                       obj.controller.view.sel_backdate.setAttribute('disabled','false');
                                                        obj.controller.view.sel_opac.setAttribute('disabled','false');
                                                        obj.controller.view.sel_patron.setAttribute('disabled','false');
                                                        obj.controller.view.sel_last_patron.setAttribute('disabled','false');
@@ -156,6 +158,22 @@ circ.checkin.prototype = {
                                                        }
                                                }
                                        ],
+                                       'sel_backdate' : [
+                                               ['command'],
+                                               function() {
+                                                       JSAN.use('circ.util');
+                                                       for (var i = 0; i < obj.selection_list.length; i++) {
+                                var circ_id = obj.selection_list[i].circ_id; 
+                                var copy_id = obj.selection_list[i].copy_id; 
+                                if (!circ_id) {
+                                    var blob = obj.network.simple_request('FM_ACP_DETAILS',[ses(),copy_id]);
+                                    if (blob.circ) circ_id = blob.circ.id();
+                                }
+                                if (!circ_id) continue;
+                                                               circ.util.backdate_post_checkin( circ_id );
+                                                       }
+                                               }
+                                       ],
                                        'sel_mark_items_damaged' : [
                                                ['command'],
                                                function() {
@@ -345,7 +363,7 @@ circ.checkin.prototype = {
                                || checkin.ilsevent == 7009 /* CIRC_CLAIMS_RETURNED */ 
                                || checkin.ilsevent == 7011 /* COPY_STATUS_LOST */ 
                                || checkin.ilsevent == 7012 /* COPY_STATUS_MISSING */) return obj.on_failure();
-                       var retrieve_id = js2JSON( { 'copy_id' : checkin.copy.id(), 'barcode' : checkin.copy.barcode(), 'doc_id' : (typeof checkin.record != 'undefined' ? ( typeof checkin.record.ilsevent == 'undefined' ? checkin.record.doc_id() : null ) : null ) } );
+                       var retrieve_id = js2JSON( { 'circ_id' : checkin.circ ? checkin.circ.id() : null , 'copy_id' : checkin.copy.id(), 'barcode' : checkin.copy.barcode(), 'doc_id' : (typeof checkin.record != 'undefined' ? ( typeof checkin.record.ilsevent == 'undefined' ? checkin.record.doc_id() : null ) : null ) } );
                        if (checkin.circ && checkin.circ.checkin_time() == 'now') checkin.circ.checkin_time(backdate);
                        if (document.getElementById('trim_list')) {
                                var x = document.getElementById('trim_list');
index 6f8f93c..1ad1663 100644 (file)
@@ -85,6 +85,7 @@
                
                <command id="sel_clip" disabled="true"/>
                <command id="sel_edit" disabled="true"/>
+               <command id="sel_backdate" disabled="true"/>
                <command id="sel_opac" disabled="true"/>
                <command id="sel_patron" disabled="true"/>
                <command id="sel_last_patron" disabled="true"/>
index 8cd3527..9cf7b33 100644 (file)
@@ -22,6 +22,7 @@
                <menuitem command="sel_last_patron" label="&staff.circ.checkin_overlay.sel_last_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_last_patron.accesskey;"/>
                <menuseparator/>
                <menuitem command="sel_edit" label="&staff.circ.checkin_overlay.sel_edit.label;" accesskey="&staff.circ.checkin_overlay.sel_edit.accesskey;" />
+               <menuitem command="sel_backdate" label="&staff.circ.checkin_overlay.sel_backdate.label;" accesskey="&staff.circ.checkin_overlay.sel_backdate.accesskey;" />
                <menuseparator />
                <menuitem command="sel_mark_items_damaged" label="&staff.circ.checkin_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey;"/>
                <menuseparator />
@@ -86,6 +87,7 @@
                                        <menuitem command="sel_last_patron" label="&staff.circ.checkin_overlay.sel_last_patron.label;" accesskey="&staff.circ.checkin_overlay.sel_last_patron.accesskey;"/>
                                        <menuseparator/>
                                        <menuitem command="sel_edit" label="&staff.circ.checkin_overlay.sel_edit.label;" accesskey="&staff.circ.checkin_overlay.sel_edit.accesskey;" />
+                           <menuitem command="sel_backdate" label="&staff.circ.checkin_overlay.sel_backdate.label;" accesskey="&staff.circ.checkin_overlay.sel_backdate.accesskey;" />
                                        <menuseparator />
                                        <menuitem command="sel_mark_items_damaged" label="&staff.circ.checkin_overlay.sel_mark_items_damaged.label;" accesskey="&staff.circ.checkin_overlay.sel_mark_items_damaged.accesskey;"/>
                                        <menuseparator />
index a0c7382..7589b02 100644 (file)
                                        g.network.simple_request( 'FM_CIRC_RETRIEVE_VIA_ID', [ ses(), g.circ_id ], circ_callback);
                                } else {
                                        g.circ = g.data.temp_circ; g.data.temp_circ = null; g.data.stash('temp_circ');
-                                       g.circ_id = g.circ.id();
-                                       circ_callback( { 'getResultObject' : function() { return g.circ; } } );
+                                       g.circ_id = g.data.temp_circ_id; g.data.temp_circ_id = null; g.data.stash('temp_circ_id');
+                                       if (!g.circ_id) g.circ_id = g.circ.id();
+                    if (g.circ) {
+                        circ_callback( { 'getResultObject' : function() { return g.circ; } } );
+                    } else {
+                                           g.network.simple_request( 'FM_CIRC_RETRIEVE_VIA_ID', [ ses(), g.circ_id ], circ_callback);
+                    }
                                }
 
                        } catch(E) {
index 5a65b52..9a408e2 100644 (file)
@@ -7,7 +7,7 @@ circ.util = {};
 circ.util.EXPORT_OK    = [
        'offline_checkout_columns', 'offline_checkin_columns', 'offline_renew_columns', 'offline_inhouse_use_columns',
        'columns', 'hold_columns', 'checkin_via_barcode', 'std_map_row_to_columns',
-       'show_last_few_circs', 'abort_transits', 'transit_columns', 'work_log_columns', 'renew_via_barcode'
+       'show_last_few_circs', 'abort_transits', 'transit_columns', 'work_log_columns', 'renew_via_barcode', 'backdate_post_checkin'
 ];
 circ.util.EXPORT_TAGS  = { ':all' : circ.util.EXPORT_OK };
 
@@ -84,6 +84,47 @@ circ.util.show_copy_details = function(copy_id) {
        }
 };
 
+circ.util.backdate_post_checkin = function(circ_id) {
+       var obj = {};
+       JSAN.use('util.error'); obj.error = new util.error();
+       JSAN.use('util.window'); obj.win = new util.window();
+       JSAN.use('util.network'); obj.network = new util.network();
+       JSAN.use('OpenILS.data'); obj.data = new OpenILS.data(); obj.data.init({'via':'stash'});
+    JSAN.use('util.sound'); obj.sound = new util.sound();
+
+    var circStrings = document.getElementById('circStrings');
+
+       if (typeof circ_id == 'object' && circ_id != null) circ_id = circ_id.id();
+
+       try {
+               var url = xulG.url_prefix( urls.XUL_BACKDATE );
+        obj.data.temp_circ_id = circ_id; obj.data.stash('temp_circ_id');
+               var my_xulG = obj.win.open( url, 'backdate_post_checkin', 'chrome,resizable,modal', {} );
+
+               if (typeof my_xulG.proceed == 'undefined') return;
+
+        var r = obj.network.simple_request( 'FM_CIRC_BACKDATE', [ ses(), circ_id, my_xulG.backdate ] );
+        if (r == 1) {
+            obj.sound.circ_good();
+            var x = $('no_change_label');
+            if (x) {
+                x.hidden = false;
+                x.setAttribute('value', circStrings.getFormattedString('staff.circ.backdate.success',[circ_id,my_xulG.backdate]));
+            }
+        } else {
+            obj.sound.circ_bad();
+            var x = $('no_change_label');
+            if (x) {
+                x.hidden = false;
+                x.setAttribute('value', circStrings.getFormattedString('staff.circ.backdate.failed',[circ_id,r.textcode]));
+            }
+        }
+
+       } catch(E) {
+               obj.error.standard_unexpected_error_alert(circStrings.getString('staff.circ.utils.retrieve_copy.failure'),E);
+       }
+};
+
 
 circ.util.show_last_few_circs = function(selection_list) {
        var obj = {};
index c81be64..390c99a 100644 (file)
@@ -21,6 +21,8 @@ staff.circ.checkin.exception.no_external=circ.checkin: Calling external .on_chec
 staff.circ.checkin2.exception.no_external=circ.util.checkin2: No external .on_failure()
 staff.circ.util.checkin.exception.external=circ.util.checkin: Calling external .on_checkin()
 staff.circ.util.checkin.exception.no_external=circ.util.checkin: Calling external .on_checkin()
+staff.circ.backdate.success=Circ ID %1$s backdated to %2$s
+staff.circ.backdate.failure=Circ ID %1$s failed backdating due to %2$s
 staff.circ.checkout.sorting.exception=error in sorting non-cataloged items: %1$s
 staff.circ.checkout.date.exception=Use this format: YYYY-MM-DD
 staff.circ.checkout.unimplemented=Not Yet Implemented