<field reporter:label="Shelving Location" name="copy_location" reporter:datatype="link"/>
<field reporter:label="Archived Patron Stat-Cat Entries" name="aaactsc_entries" oils_persist:virtual="true" reporter:datatype="link"/>
<field reporter:label="Archived Copy Stat-Cat Entries" name="aaasc_entries" oils_persist:virtual="true" reporter:datatype="link"/>
+ <field reporter:label="Hide from User History" name="hide_from_usr_history" reporter:datatype="bool"/>
</fields>
<links>
<link field="billable_transaction" reltype="might_have" key="id" map="" class="mbt"/>
my $ctx = $self->ctx;
my $limit = $self->cgi->param('limit') || 15;
my $offset = $self->cgi->param('offset') || 0;
+ my $action = $self->cgi->param('action') || '';
+
+ my $circ_handle_result;
+ $circ_handle_result = $self->handle_circ_update($action) if $action;
$ctx->{circ_history_limit} = $limit;
$ctx->{circ_history_offset} = $offset;
}
$ctx->{circs} = $self->fetch_user_circs(1, [map { $_->{id} } @$circ_ids]);
- return Apache2::Const::OK;
+ return defined($circ_handle_result) ? $circ_handle_result : Apache2::Const::OK;
+}
+
+sub handle_circ_update {
+ my $self = shift;
+ my $action = shift;
+ my $circ_ids = shift;
+ my $e = $self->editor;
+ my $url;
+
+ my @circ_ids = ($circ_ids) ? @$circ_ids : $self->cgi->param('circ_id'); # for non-_all actions
+
+ my $cstore_ses = OpenSRF::AppSession->create('open-ils.cstore');
+ $cstore_ses->connect();
+ $cstore_ses->request('open-ils.cstore.transaction.begin')->gather(1);
+
+ if($action =~ /delete/) {
+ for my $circ_id (@circ_ids) {
+ my $circ = $cstore_ses->request(
+ 'open-ils.cstore.direct.action.circulation.retrieve', $circ_id)->gather(1);
+ $circ->hide_from_usr_history(1);
+ my $resp = $cstore_ses->request(
+ 'open-ils.cstore.direct.action.circulation.update', $circ)->gather(1);
+ }
+ }
+
+ $cstore_ses->request('open-ils.cstore.transaction.commit')->gather(1);
+ $cstore_ses->disconnect();
+ return undef;
}
# TODO: action.usr_visible_holds does not return cancelled holds. Should it?
ON DELETE SET NULL
DEFERRABLE INITIALLY DEFERRED,
copy_location INT NOT NULL DEFAULT 1 REFERENCES asset.copy_location (id) DEFERRABLE INITIALLY DEFERRED,
- checkin_scan_time TIMESTAMP WITH TIME ZONE
+ checkin_scan_time TIMESTAMP WITH TIME ZONE,
+ hide_from_usr_history BOOL NOT NULL DEFAULT FALSE
) INHERITS (money.billable_xact);
ALTER TABLE action.circulation ADD PRIMARY KEY (id);
ALTER TABLE action.circulation
WHERE usr = usr_id
AND parent_circ IS NULL
AND xact_start > NOW() - view_age
+ AND NOT hide_from_usr_history
ORDER BY xact_start DESC
LOOP
RETURN NEXT c;
--- /dev/null
+BEGIN;
+
+ALTER TABLE action.circulation
+ ADD COLUMN hide_from_usr_history boolean not null default false;
+
+COMMIT;
+
+BEGIN;
+
+CREATE OR REPLACE FUNCTION action.usr_visible_circs(usr_id integer)
+ RETURNS SETOF action.circulation
+ LANGUAGE plpgsql
+AS $function$
+DECLARE
+ c action.circulation%ROWTYPE;
+ view_age INTERVAL;
+ usr_view_age actor.usr_setting%ROWTYPE;
+ usr_view_start actor.usr_setting%ROWTYPE;
+BEGIN
+ SELECT * INTO usr_view_age FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_age';
+ SELECT * INTO usr_view_start FROM actor.usr_setting WHERE usr = usr_id AND name = 'history.circ.retention_start';
+
+ IF usr_view_age.value IS NOT NULL AND usr_view_start.value IS NOT NULL THEN
+ -- User opted in and supplied a retention age
+ IF oils_json_to_text(usr_view_age.value)::INTERVAL > AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ) THEN
+ view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
+ ELSE
+ view_age := oils_json_to_text(usr_view_age.value)::INTERVAL;
+ END IF;
+ ELSIF usr_view_start.value IS NOT NULL THEN
+ -- User opted in
+ view_age := AGE(NOW(), oils_json_to_text(usr_view_start.value)::TIMESTAMPTZ);
+ ELSE
+ -- User did not opt in
+ RETURN;
+ END IF;
+
+ FOR c IN
+ SELECT *
+ FROM action.circulation
+ WHERE usr = usr_id
+ AND parent_circ IS NULL
+ AND xact_start > NOW() - view_age
+ AND NOT hide_from_usr_history
+ ORDER BY xact_start DESC
+ LOOP
+RETURN NEXT c;
+ END LOOP;
+
+ RETURN;
+END;
+$function$
+
+COMMIT;
<div class="warning_box">[% l('There are no items in your circulation history.') %]</div>
[% ELSE %]
+ <form method="post" id="circ-form"
+ onsubmit="return confirm('[% l("Are you sure you wish to delete the selected item(s)?") %]');">
+ <table cellpadding='0' cellspacing='0' class="item_list_padding">
+ <tr>
+ <td>
+ <select name="action">
+ <option value="delete">[% l('Delete Selected Titles') %]</option>
+ </select>
+ </td>
+ <td style="padding-left:9px;">
+ <input type="submit"
+ value="[% l('Go') %]"
+ alt="[% l('Go') %]" title="[% l('Go') %]"
+ class="opac-button" />
+ </td>
+ <!--
+ <td style="padding-left:5px;">
+ <a href="#"><img alt="[% l('Deleting Help') %]"
+ src="[% ctx.media_prefix %]/images/question-mark.png" /></a>
+ </td>
+ -->
+ </tr>
+ </table>
<div id='checked_main'>
<table id="acct_checked_main_header"
title="[% l('History of Items Checked Out') %]">
<thead>
<tr>
+ <th align="center">
+ <input type="checkbox" onclick="var inputs=document.getElementsByTagName('input'); for (i = 0; i < inputs.length; i++) { if (inputs[i].name == 'circ_id' && !inputs[i].disabled) inputs[i].checked = this.checked;}"/>
+ </th>
<th>[% sort_head("sort_title", l("Title")) %]</th>
<th>[% sort_head("author", l("Author")) %]</th>
<th>[% sort_head("checkout", l("Checkout Date")) %]</th>
FOR circ IN circ_items; %]
<tr>
+ <td align="center" style="text-align:center;">
+ <input type="checkbox" name="circ_id" value="[% circ.circ.id %]" />
+ </td>
<td>
<a href="[% mkurl(ctx.opac_root _ '/record/' _
circ.circ.target_copy.call_number.record.id, {}, 1) %]"
</td>
<td>[% circ.circ.target_copy.barcode | html %]</td>
<td>[% circ.circ.target_copy.call_number.label | html %]</td>
+ </form>
</tr>
[% END %]
</tbody>
--- /dev/null
+Editable Borrowing History
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+You can delete titles that you do not wish to appear in your Check Out History.
+
+ * In "My Account", click on the "Items Checked Out" tab, then the "Check Out History" sub-tab.
+ * Check off the items you wish to conceal.
+ * Click the Go button next to the "Delete Selected Titles" drop-down box.
+ * Click OK in the pop-up to confirm your deletion. Choose carefully, as there is no "undo".
+
+Deleted titles will also not appear in the downloaded CSV file.