<class id="acqclt" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="acq::claim_type" oils_persist:tablename="acq.claim_type" reporter:label="Claim Type">
<fields oils_persist:primary="id" oils_persist:sequence="acq.claim_type_id_seq">
- <field reporter:label="Claim Type ID" name="id" reporter:datatype="id"/>
+ <field reporter:label="Claim Type ID" name="id" reporter:datatype="id" reporter:selector="code" />
<field reporter:label="Org Unit" name="org_unit" reporter:datatype="org_unit"/>
<field reporter:label="Code" name="code" reporter:datatype="text"/>
<field reporter:label="Description" name="description" reporter:datatype="text"/>
api_name => 'open-ils.acq.claim.eligible.lineitem_detail',
stream => 1,
signature => {
- desc => q/Locates lineitem_detail's that are eligible for claiming/,
+ desc => q/Locates lineitem_details that are eligible for claiming/,
params => [
{desc => 'Authentication token', type => 'string'},
{ desc => q/
lineitem
lineitem_detail
claim_policy_action
+ ordering_agency
/,
type => 'object'
},
}
__PACKAGE__->register_method(
+ method => "claim_item",
+ api_name => "open-ils.acq.claim.lineitem",
+ stream => 1,
+ signature => {
+ desc => q/Initiates a claim for a lineitem/,
+ params => [
+ {desc => "Authentication token", type => "string"},
+ {desc => "Lineitem ID", type => "number"},
+ {desc => q/Claim (acqcl) ID. If defined, attach new claim
+ events to this existing claim object/, type => "number"},
+ {desc => q/Claim Type (acqclt) ID. If defined (and no claim is
+ defined), create a new claim with this type/, type => "number"},
+ {desc => "Note for the claim event", type => "string"},
+ {desc => q/Optional: Claim Policy Actions. If not present,
+ claim events for all eligible claim policy actions will be
+ created. This is an array of acqclpa IDs./,
+ type => "array"},
+ ],
+ return => {desc => "The claim events on success, Event on error",
+ type => "object", class => "acrlid"}
+ }
+);
+
+__PACKAGE__->register_method(
method => 'claim_item',
api_name => 'open-ils.acq.claim.lineitem_detail',
stream => 1,
{desc => 'Lineitem Detail ID', type => 'number'},
{desc => 'Claim (acqcl) ID. If defined, attach new claim events to this existing claim object', type => 'number'},
{desc => 'Claim Type (acqclt) ID. If defined (and no claim is defined), create a new claim with this type', type => 'number'},
+ {desc => "Note for the claim event", type => "string"},
{ desc => q/
Optional: Claim Policy Actions. If not present, claim events
my $claim_type_id = shift;
my $note = shift;
my $policy_actions = shift;
- my $only_eligible = shift;
+# my $only_eligible = shift; # so far unused
my $e = new_editor(xact => 1, authtoken=>$auth);
return $e->die_event unless $e->checkauth;
trigger_stuff => []
};
+ my $lid_flesh = {
+ "flesh" => 2,
+ "flesh_fields" => {
+ "acqlid" => ["lineitem"], "jub" => ["purchase_order"],
+ }
+ };
+
if($claim_id) {
$claim = $e->retrieve_acq_claim($claim_id) or return $e->die_event;
} elsif($claim_type_id) {
if($self->api_name =~ /claim.lineitem_detail/) {
- my $lid = $e->retrieve_acq_lineitem_detail([
- $object_id,
- {
- flesh => 2,
- flesh_fields => {
- acqlid => ['lineitem'],
- jub => ['purchase_order'],
- }
- }
- ]) or return $e->die_event;
+ my $lid = $e->retrieve_acq_lineitem_detail([$object_id, $lid_flesh]) or
+ return $e->die_event;
return $evt if
$evt = claim_lineitem_detail(
$e, $lid, $claim, $claim_type, $policy_actions, $note, $claim_events);
} elsif($self->api_name =~ /claim.lineitem/) {
+ my $lids = $e->search_acq_lineitem_detail([
+ {"lineitem" => $object_id, "cancel_reason" => undef},
+ $lid_flesh
+ ]) or return $e->die_event;
- # TODO: add support for claiming from a lineitem
+ foreach my $lid (@$lids) {
+ return $evt if
+ $evt = claim_lineitem_detail(
+ $e, $lid, $claim, $claim_type, $policy_actions,
+ $note, $claim_events
+ );
+ }
}
$e->commit;
- $conn->respond_complete($claim_events->{events});
# create related A/T events
$U->create_events_for_hook('claim_event.created', $_->[0], $_->[1]) for @{$claim_events->{trigger_stuff}};
+
+ # do voucher rendering and return result
+ $conn->respond($U->fire_object_event(
+ undef, "format.acqcle.html", $_->[0], $_->[1], "print-on-demand"
+ )) foreach @{$claim_events->{trigger_stuff}};
return undef;
}
((($balance - $debit_amount) / $allocations) * 100) <
$fund->$method_name
) {
- $e->event(
- new OpenILS::Event(
- $event_name,
- "payload" => {
- "fund" => $fund,
- "debit_amount" => $debit_amount
- }
- )
- );
- return 1;
+ $logger->info("fund would hit a limit: " . $fund->id . ", $balance, $debit_amount, $allocations, $method_name");
+ $e->event(
+ new OpenILS::Event(
+ $event_name,
+ "payload" => {
+ "fund" => $fund, "debit_amount" => $debit_amount
+ }
+ )
+ );
+ return 1;
}
}
return 0;
return $e->die_event unless $e->checkauth;
my $mgr = OpenILS::Application::Acq::BatchManager->new(editor => $e, conn => $conn);
my $die_event = activate_purchase_order_impl($mgr, $po_id, $dry_run);
- return $die_event if $die_event;
+ return $e->die_event if $die_event;
if ($dry_run) {
$e->rollback;
} else {
install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
);
-INSERT INTO config.upgrade_log (version) VALUES ('0237'); -- dbs
+INSERT INTO config.upgrade_log (version) VALUES ('0238'); -- senator
CREATE TABLE config.bib_source (
id SERIAL PRIMARY KEY,
INSERT INTO action_trigger.environment ( event_def, path) VALUES
( 20, 'usr.home_ou' );
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+ VALUES (
+ 'format.acqcle.html',
+ 'acqcle',
+ 'Formats claim events into a voucher',
+ TRUE
+ );
+
+INSERT INTO action_trigger.event_definition (
+ id, active, owner, name, hook, group_field,
+ validator, reactor, granularity, template
+ ) VALUES (
+ 21,
+ TRUE,
+ 1,
+ 'Claim Voucher',
+ 'format.acqcle.html',
+ 'claim',
+ 'NOOP_True',
+ 'ProcessTemplate',
+ 'print-on-demand',
+$$
+[%- USE date -%]
+[%- SET claim = target.0.claim -%]
+<!-- This will need refined/prettified. -->
+<div class="acq-claim-voucher">
+ <h2>Claim: [% claim.id %] ([% claim.type.code %])</h2>
+ <h3>Against: [%- helpers.get_li_attr("title", "", claim.lineitem_detail.lineitem.attributes) -%]</h3>
+ <ul>
+ [% FOR event IN target %]
+ <li>
+ Event type: [% event.type.code %]
+ [% IF event.type.library_initiated %](Library initiated)[% END %]
+ <br />
+ Event date: [% event.event_date %]<br />
+ Order date: [% event.claim.lineitem_detail.lineitem.purchase_order.order_date %]<br />
+ Expected receive date: [% event.claim.lineitem_detail.lineitem.expected_recv_time %]<br />
+ Initiated by: [% event.creator.family_name %], [% event.creator.first_given_name %] [% event.creator.second_given_name %]<br />
+ Barcode: [% event.claim.lineitem_detail.barcode %]; Fund:
+ [% event.claim.lineitem_detail.fund.code %]
+ ([% event.claim.lineitem_detail.fund.year %])
+ </li>
+ [% END %]
+ </ul>
+</div>
+$$
+);
+
+INSERT INTO action_trigger.environment (event_def, path) VALUES
+ (21, 'claim'),
+ (21, 'claim.type'),
+ (21, 'claim.lineitem_detail'),
+ (21, 'claim.lineitem_detail.fund'),
+ (21, 'claim.lineitem_detail.lineitem.attributes'),
+ (21, 'claim.lineitem_detail.lineitem.purchase_order'),
+ (21, 'creator'),
+ (21, 'type')
+;
+
SELECT SETVAL('action_trigger.event_definition_id_seq'::TEXT, 100);
-- Org Unit Settings for configuring org unit weights and org unit max-loops for hold targeting
--- /dev/null
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0238'); -- senator
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+ VALUES (
+ 'format.acqcle.html',
+ 'acqcle',
+ 'Formats claim events into a voucher',
+ TRUE
+ );
+
+INSERT INTO action_trigger.event_definition (
+ id, active, owner, name, hook, group_field,
+ validator, reactor, granularity, template
+ ) VALUES (
+ 21,
+ TRUE,
+ 1,
+ 'Claim Voucher',
+ 'format.acqcle.html',
+ 'claim',
+ 'NOOP_True',
+ 'ProcessTemplate',
+ 'print-on-demand',
+$$
+[%- USE date -%]
+[%- SET claim = target.0.claim -%]
+<!-- This will need refined/prettified. -->
+<div class="acq-claim-voucher">
+ <h2>Claim: [% claim.id %] ([% claim.type.code %])</h2>
+ <h3>Against: [%- helpers.get_li_attr("title", "", claim.lineitem_detail.lineitem.attributes) -%]</h3>
+ <ul>
+ [% FOR event IN target %]
+ <li>
+ Event type: [% event.type.code %]
+ [% IF event.type.library_initiated %](Library initiated)[% END %]
+ <br />
+ Event date: [% event.event_date %]<br />
+ Order date: [% event.claim.lineitem_detail.lineitem.purchase_order.order_date %]<br />
+ Expected receive date: [% event.claim.lineitem_detail.lineitem.expected_recv_time %]<br />
+ Initiated by: [% event.creator.family_name %], [% event.creator.first_given_name %] [% event.creator.second_given_name %]<br />
+ Barcode: [% event.claim.lineitem_detail.barcode %]; Fund:
+ [% event.claim.lineitem_detail.fund.code %]
+ ([% event.claim.lineitem_detail.fund.year %])
+ </li>
+ [% END %]
+ </ul>
+</div>
+$$
+);
+
+
+INSERT INTO action_trigger.environment (event_def, path) VALUES
+ (21, 'claim'),
+ (21, 'claim.type'),
+ (21, 'claim.lineitem_detail'),
+ (21, 'claim.lineitem_detail.fund'),
+ (21, 'claim.lineitem_detail.lineitem.attributes'),
+ (21, 'claim.lineitem_detail.lineitem.purchase_order'),
+ (21, 'creator'),
+ (21, 'type')
+;
+
+COMMIT;
+
#oils-acq-fund-xfer-submit-row { text-align: center; }
/* li search page */
-h1.oils-acq-li-search { font-size: 150%;font-weight: bold;margin-bottom: 12px; }
-h2.oils-acq-li-search { font-size: 138%;font-weight: bold;margin-bottom: 11px; }
-h3.oils-acq-li-search { font-size: 125%;font-weight: bold;margin-bottom: 10px; }
-h4.oils-acq-li-search { font-size: 112%;font-weight: bold;margin-bottom: 9px; }
+h1 { font-size: 150%;font-weight: bold;margin-bottom: 12px; }
+h2 { font-size: 138%;font-weight: bold;margin-bottom: 11px; }
+h3 { font-size: 125%;font-weight: bold;margin-bottom: 10px; }
+h4 { font-size: 112%;font-weight: bold;margin-bottom: 9px; }
#oils-acq-li-search-form-holder {border-bottom: 2px #666 inset; margin: 6px 0;}
.oils-acq-li-search-form-row { margin: 6px 0; }
input.oils-acq-li-search { margin: 0 12px; }
.acq-unified-terms-match { width: 15%; }
.acq-unified-terms-remove { width: 5%; text-align: right; }
.acq-unified-remover { color: #c00; }
+
+#acq-eligible-li-table { margin: 10px 0; }
+#acq-eligible-li-table th { background-color: #ccc; border: 1px #333 inset; font-weight: bold; padding: 6px; }
+#acq-eligible-li-table td { padding: 2px 6px; border: 1px #333 inset; }
+#acq-eligible-li-table div[name="lid_link_holder"] { margin-left: 10px; }
"<a style='padding-right: 10px;' href='${11}/acq/picklist/view/${14}'>SL: ${15}</a></div>",
'INVOICE_CONFIRM_PRORATE' : "Prorate charges?\n\nAny subsequent changes to the invoice that would affect prorated amounts should be resolved manually.",
'UNNAMED': "Unnamed",
- 'NO_FIND_INVOICE': "Could not find that invoice.\nNote that the Invoice # field is case-sensitive."
+ 'NO_FIND_INVOICE': "Could not find that invoice.\nNote that the Invoice # field is case-sensitive.",
+ 'NO_LI_TO_CLAIM': "You have not selected any lineitems to claim.",
+ 'CLAIM_VOUCHERS': "Claim Vouchers",
+ 'PRINT': "Print"
}
--- /dev/null
+dojo.require("dijit.form.TextBox");
+dojo.require("openils.acq.Lineitem");
+dojo.require("openils.widget.OrgUnitFilteringSelect");
+dojo.require("openils.widget.ProgressDialog");
+dojo.require("openils.widget.AutoFieldWidget");
+
+var eligibleLiTable;
+
+function nodeByName(n, c) { return dojo.query("[name='" + n + "']", c)[0]; }
+
+function EligibleLiTable(filter) {
+ var self = this;
+
+ this.filter = filter;
+ this.liCache = {};
+ this.numClaimableLids = {};
+
+ this.claimNote = dijit.byId("acq-eligible-claim-note");
+ this.table = dojo.byId("acq-eligible-li-table");
+ this.tBody = dojo.query("tbody", this.table)[0];
+ this.tHead = dojo.query("thead", this.table)[0];
+ [this.rowTemplate, this.emptyTemplate] =
+ dojo.query("tr", this.tBody).map(
+ function(o) { return self.tBody.removeChild(o); }
+ );
+
+ nodeByName("selector_all", this.tHead).onclick = function() {
+ var value = this.checked;
+ dojo.query("[name='selector']", self.tBody).forEach(
+ function(o) { o.checked = value; }
+ );
+ };
+
+ new openils.widget.AutoFieldWidget({
+ "fmClass": "acqclt",
+ "selfReference": true,
+ "dijitArgs": {"required": true},
+ "parentNode": dojo.byId("acq-eligible-claim-type")
+ }).build(function(w) { self.claimType = w; });
+
+ new openils.User().buildPermOrgSelector(
+ "VIEW_PURCHASE_ORDER", orderingAgency, null,
+ function() {
+ orderingAgency.attr("value", self.filter.ordering_agency);
+ dojo.connect(
+ orderingAgency, "onChange",
+ function() {
+ self.filter.ordering_agency = this.attr("value");
+ self.load();
+ }
+ );
+ self.load();
+ }
+ );
+
+ this.showEmpty = function() {
+ dojo.place(dojo.clone(this.emptyTemplate), this.tBody, "only");
+ openils.Util.hide("acq-eligible-claim-controls");
+ };
+
+ this.load = function() {
+ progressDialog.show(true);
+
+ var count = 0;
+ this.reset();
+ fieldmapper.standardRequest(
+ ["open-ils.acq", "open-ils.acq.claim.eligible.lineitem_detail"], {
+ "params": [openils.User.authtoken, this.filter],
+ "async": true,
+ "onresponse": function(r) {
+ if (r = openils.Util.readResponse(r)) {
+ if (!count++)
+ openils.Util.show("acq-eligible-claim-controls");
+ self.addIfMissing(r.lineitem());
+ } else {
+ progressDialog.hide();
+ }
+ },
+ "oncomplete": function() {
+ if (count < 1) self.showEmpty();
+ progressDialog.hide();
+ }
+ }
+ );
+ };
+
+ this.reset = function() {
+ this.liCache = {};
+ this.numClaimableLids = {};
+ dojo.empty(this.tBody);
+ };
+
+ this._updateLidLink = function(liId) {
+ this.numClaimableLids[liId] = (this.numClaimableLids[liId] || 0) + 1;
+ if (this.numClaimableLids[liId] == 2) {
+ nodeByName("lid_link", "eligible-li-" + liId).onclick =
+ function() {
+ location.href = oilsBasePath + "/acq/po/view/" +
+ self.liCache[liId].purchase_order().id() + "," +
+ liId;
+ };
+ openils.Util.show(
+ nodeByName("lid_link_holder", "eligible-li-" + liId)
+ );
+ }
+ };
+
+ /* Despite being called with an argument that's a lineitem ID, this method
+ * is actually called once per lineitem _detail_. */
+ this.addIfMissing = function(liId) {
+ this._updateLidLink(liId);
+ if (this.liCache[liId]) return;
+
+ var row = dojo.clone(this.rowTemplate);
+
+ var checkbox = nodeByName("selector", row);
+ var desc = nodeByName("description", row);
+
+ openils.acq.Lineitem.fetchAndRender(
+ liId, null, function(li, contents) {
+ self.liCache[liId] = li;
+
+ desc.innerHTML = contents;
+ dojo.attr(row, "id", "eligible-li-" + liId);
+ dojo.attr(checkbox, "value", liId);
+ dojo.place(row, self.tBody, "last");
+ }
+ );
+ };
+
+ /* Despite being called with an argument that's a lineitem ID, this method
+ * is actually called once per lineitem _detail_. */
+ this.removeIfPresent = function(liId) {
+ if (this.liCache[liId]) {
+ delete this.liCache[liId];
+ delete this.numClaimableLids[liId];
+ this.tBody.removeChild(dojo.byId("eligible-li-" + liId));
+ }
+ };
+
+ this.getSelected = function() {
+ return dojo.query("[name='selector']", this.tBody).
+ filter(function(o) { return o.checked; }).
+ map(function(o) { return o.value; });
+ };
+
+ this.resetVoucher = function() { this.voucherWin = null; };
+
+ this.addToVoucher = function(contents) {
+ if (!this.voucherWin) {
+ this.voucherWin = window.open(
+ "", "", "resizable,width=800,height=600,scrollbars=1"
+ );
+ this.voucherWin.document.title = localeStrings.CLAIM_VOUCHERS;
+ this.voucherWin.document.body.innerHTML = (
+ "<button onclick='window.print();'>" +
+ localeStrings.PRINT +
+ "</button><hr /><div id='main'></div>"
+ );
+ }
+ dojo.byId("main", this.voucherWin.document).innerHTML += (
+ contents + "<hr />"
+ );
+ };
+
+ this.claim = function() {
+ var lineitems = this.getSelected();
+ if (!lineitems.length) {
+ alert(localeStrings.NO_LI_TO_CLAIM);
+ return;
+ }
+
+ progressDialog.show(true);
+ self.resetVoucher();
+
+ fieldmapper.standardRequest(
+ ["open-ils.acq", "open-ils.acq.claim.lineitem"], {
+ "params": [
+ openils.User.authtoken, lineitems, null,
+ this.claimType.attr("value"), this.claimNote.attr("value")
+ ],
+ "async": true,
+ "onresponse": function(r) {
+ if (r = openils.Util.readResponse(r))
+ self.addToVoucher(r.template_output().data());
+ else
+ progressDialog.hide();
+ },
+ "oncomplete": function() {
+ lineitems.forEach(
+ function(liId) { self.removeIfPresent(liId); }
+ );
+ if (!nodeByName("selector", self.tBody)) // emptiness test
+ self.showEmpty();
+ progressDialog.hide();
+ }
+ }
+ );
+ };
+}
+
+function init() {
+ var finished_filter = {};
+ if (filter && filter.indexOf(":") != -1) {
+ filter.split(",").forEach(
+ function(chunk) {
+ var [key, value] = chunk.split(":");
+ finished_filter[key] = value;
+ }
+ );
+ }
+ filter = finished_filter;
+
+ if (!filter.ordering_agency)
+ filter.ordering_agency = openils.User.user.ws_ou();
+
+ eligibleLiTable = new EligibleLiTable(filter);
+}
+
+openils.Util.addOnLoad(init);
return false;
}
+ var want_refresh = false;
progressDialog.show(true);
- try {
- fieldmapper.standardRequest(
- ['open-ils.acq', 'open-ils.acq.purchase_order.activate'],
- { async: true,
- params: [openils.User.authtoken, PO.id()],
- oncomplete : function() {
+ fieldmapper.standardRequest(
+ ["open-ils.acq", "open-ils.acq.purchase_order.activate"], {
+ "async": true,
+ "params": [openils.User.authtoken, PO.id()],
+ "onresponse": function(r) {
+ want_refresh = Boolean(openils.Util.readResponse(r));
+ },
+ "oncomplete": function() {
+ progressDialog.hide();
+ if (want_refresh)
location.href = location.href;
- }
}
- );
- } catch(E) {
- progressDialog.hide();
- }
+ }
+ );
}
function splitPo() {
<!ENTITY staff.main.menu.acq.currency_type.accesskey "C">
<!ENTITY staff.main.menu.acq.exchange_rate.label "Exchange Rates">
<!ENTITY staff.main.menu.acq.exchange_rate.accesskey "X">
+<!ENTITY staff.main.menu.acq.claim_eligible.label "Claim-Eligible Items">
+<!ENTITY staff.main.menu.acq.claim_eligible.accesskey "M">
<!ENTITY staff.main.menu.booking.label "Booking">
<!ENTITY staff.main.menu.booking.accesskey "B">
--- /dev/null
+[% WRAPPER "default/base.tt2" %]
+[% ctx.page_title = "Items Eligible For Claiming" %]
+<script>var filter = "[% ctx.page_args.0 %]";</script>
+<script
+ src="[% ctx.media_prefix %]/js/ui/default/acq/financial/claim_eligible.js">
+</script>
+<div>
+ <h1>Items Eligible For Claiming</h1>
+ <div class="oils-acq-basic-roomy">
+ Show items ready to claim for:
+ <select
+ dojoType="openils.widget.OrgUnitFilteringSelect"
+ jsId="orderingAgency" searchAttr="shortname"
+ labelAttr="shortname"></select>
+ <span dojoType="openils.widget.ProgressDialog"
+ jsId="progressDialog"></span>
+ </div>
+ <table id="acq-eligible-li-table">
+ <thead>
+ <tr>
+ <th><input type="checkbox" name="selector_all" /></th>
+ <th>Items</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr><!-- item template -->
+ <td>
+ <input type="checkbox" name="selector" />
+ </td>
+ <td>
+ <div name="description"></div>
+ <div name="lid_link_holder" class="hidden">
+ [ <a href="javascript:void(0);"
+ name="lid_link">Consider individual copies
+ for claiming</a> ]
+ </div>
+ </td>
+ </tr>
+ <tr><!-- empty template -->
+ <td colspan="2">
+ <em>There were no items matching your search.</em>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <div id="acq-eligible-claim-controls" class="hidden">
+ <label for="acq-eligible-claim-type">Claim type:</label>
+ <span id="acq-eligible-claim-type"></span>
+ <label for="acq-eligible-claim-note">Note:</label>
+ <input dojoType="dijit.form.TextBox" id="acq-eligible-claim-note" />
+ <button onclick="eligibleLiTable.claim();">Claim selected items</button>
+ </div>
+</div>
+[% END %]
</table>
</div>
</div>
- <script type="text/javascript">var poId = '[% ctx.page_args.0 %]';</script>
+ <script type="text/javascript">
+ var [poId, liFocus] = "[% ctx.page_args.0 %]".split(",");
+ </script>
[% INCLUDE 'default/acq/common/li_table.tt2' %]
[% INCLUDE "default/acq/common/notes.tt2" which = "Po" %]
</div>
['oncommand'],
function() { open_eg_web_page('conify/global/acq/distribution_formula', 'menu.cmd_acq_view_distrib_formula.tab'); }
],
+ 'cmd_acq_claim_eligible' : [
+ ['oncommand'],
+ function() { open_eg_web_page('acq/financial/claim_eligible', 'menu.cmd_acq_claim_eligible.tab'); }
+ ],
'cmd_booking_reservation' : [
['oncommand'],
function() {
<command id="cmd_acq_view_currency_type" />
<command id="cmd_acq_view_exchange_rate" />
<command id="cmd_acq_view_distrib_formula" />
+ <command id="cmd_acq_claim_eligible" />
<command id="cmd_booking_reservation" />
<command id="cmd_booking_pull_list" />
<menuitem label="&staff.main.menu.acq.currency_type.label;" accesskey="&staff.main.menu.acq.currency_type.accesskey;" command="cmd_acq_view_currency_type" />
<menuitem label="&staff.main.menu.acq.exchange_rate.label;" accesskey="&staff.main.menu.acq.exchange_rate.accesskey;" command="cmd_acq_view_exchange_rate" />
<menuitem label="&staff.main.menu.acq.distrib_formula.label;" accesskey="&staff.main.menu.acq.distrib_formula.accesskey;" command="cmd_acq_view_distrib_formula" />
+ <menuitem label="&staff.main.menu.acq.claim_eligible.label;" accesskey="&staff.main.menu.acq.claim_eligible.accesskey;" command="cmd_acq_claim_eligible" />
</menupopup>
</menu>
menu.cmd_acq_view_currency_type.tab=Currency Types
menu.cmd_acq_view_exchange_rate.tab=Exchange Rates
menu.cmd_acq_view_distrib_formula.tab=Distribution Formulas
+menu.cmd_acq_claim_eligible.tab=Claim-Eligible Items
menu.cmd_booking_resource.tab=Resources
menu.cmd_booking_reservation.tab=Reservations
menu.cmd_booking_reservation_pickup.tab=Reservation Pickup