1 /* ---------------------------------------------------------------------------
2 * Copyright (C) 2008 Georgia Public Library Service
3 * David J. Fiander <david@fiander.info>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * ---------------------------------------------------------------------------
17 if(!dojo._hasResource['openils.acq.Lineitem']) {
18 dojo._hasResource['openils.acq.Lineitem'] = true;
19 dojo.provide('openils.acq.Lineitem');
20 dojo.require('dojo.data.ItemFileWriteStore');
21 dojo.require('fieldmapper.dojoData');
22 dojo.require('openils.User');
23 dojo.require('openils.Event');
24 dojo.require('openils.Util');
25 dojo.require('dojo.date.stamp');
26 dojo.require('dojo.date.locale');
28 dojo.requireLocalization('openils.acq', 'acq');
29 var localeStrings = dojo.i18n.getLocalization('openils.acq', 'acq');
32 /** Declare the Lineitem class with dojo */
33 dojo.declare('openils.acq.Lineitem', null, {
34 /* add instance methods here if necessary */
36 constructor: function(args) {
37 this.lineitem = args.lineitem;
40 findAttr: function(name, type) {
41 var attrs = this.lineitem.attributes();
42 if(!attrs) return null;
43 for(var i = 0; i < attrs.length; i++) {
45 if (attr.attr_type() == type && attr.attr_name() == name)
46 return attr.attr_value();
50 // returns the actual price if available, otherwise estimated price, otherwise null
51 // priority is given to local attrs, then provider attrs, then MARC attrs
52 getPrice: function() {
53 return this.getActualPrice() || this.getEstimatedPrice();
56 // returns the actual price, null if none
57 getActualPrice : function() {
58 return this._getPriceAttr('actual_price');
61 // returns the estimated price, null if none
62 getEstimatedPrice : function() {
63 return this._getPriceAttr('estimated_price');
66 _getPriceAttr : function(attr) {
68 'lineitem_local_attr_definition',
69 'lineitem_provider_attr_definition',
70 'lineitem_marc_attr_definition'
74 if(price = this.findAttr(attr, types[t]))
75 return {price:price, source_type: attr, source_attr: types[t]};
81 update: function(oncomplete) {
82 fieldmapper.standardRequest(
83 ['open-ils.acq', 'open-ils.acq.lineitem.update'],
85 params: [openils.User.authtoken, this.lineitem],
86 oncomplete: function(r) {
87 oncomplete(openils.Event.parse(r.recv().content()));
93 approve: function(oncomplete) {
94 fieldmapper.standardRequest(
95 ['open-ils.acq', 'open-ils.acq.lineitem.approve'],
97 params: [openils.User.authtoken, this.lineitem.id()],
98 oncomplete: function(r) {
99 oncomplete(openils.Event.parse(r.recv().content()));
105 return this.lineitem.id();
109 openils.acq.Lineitem.identDisplayFields = ['isbn', 'upc', 'issn'];
110 openils.acq.Lineitem.fetchAndRender = function(liId, args, callback) {
112 // below are the args needed for rendering the basic summary template
113 args = dojo.mixin(args || {}, {
118 flesh_order_summary : true
121 fieldmapper.standardRequest(
122 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve.authoritative'],
124 params : [ openils.User.authtoken, liId, args ],
126 oncomplete : function(r) {
127 var lineitem = openils.Util.readResponse(r);
128 if(!lineitem) return;
130 var wrapper = new openils.acq.Lineitem({lineitem : lineitem});
131 var type = 'lineitem_marc_attr_definition';
135 openils.acq.Lineitem.identDisplayFields,
137 if(attr = wrapper.findAttr(ident, type))
142 var po = lineitem.purchase_order();
143 var pl = lineitem.picklist();
147 if(pl && pl.name() == '') // special pl
151 liLink = oilsBasePath + '/acq/po/view/' + po.id() + '/' + lineitem.id();
152 if(po.order_date()) {
153 var date = dojo.date.stamp.fromISOString(po.order_date());
155 orderDate = dojo.date.locale.format(date, {selector:'date'});
160 var displayString = dojo.string.substitute(
161 localeStrings.LINEITEM_SUMMARY, [
162 wrapper.findAttr('title', type) || '',
163 wrapper.findAttr('author', type) || '',
164 idents.join(',') || '',
165 lineitem.order_summary().item_count() || '0',
166 lineitem.order_summary().recv_count() || '0',
167 Number(lineitem.estimated_unit_price()).toFixed(2) | '',
168 lineitem.order_summary().estimated_amount() || '0.00',
169 lineitem.order_summary().invoice_count() || '0',
170 lineitem.order_summary().claim_count() || '0',
171 lineitem.order_summary().cancel_count() || '0',
175 (po) ? po.name() : '',
177 (pl) ? pl.name() : '',
178 lineitem.order_summary().encumbrance_amount() || '0.00',
179 lineitem.order_summary().paid_amount() || '0.00',
182 (po) ? 'foo' : '', // forces class='hiddenfoo' i.e. not hidden
183 (pl) ? 'foo' : '', // ditto
184 encodeURIComponent(location.pathname + location.search)
187 // prevent long titles from filling up the page
189 if(str.length > truncSize)
190 str = str.substring(0, truncSize) + '...';
195 callback(lineitem, displayString);
201 openils.acq.Lineitem.attrDefs = null;
203 openils.acq.Lineitem.fetchAttrDefs = function(onload) {
204 if(openils.acq.Lineitem.attrDefs)
205 return onload(openils.acq.Lineitem.attrDefs);
206 fieldmapper.standardRequest(
207 ['open-ils.acq', 'open-ils.acq.lineitem_attr_definition.retrieve.all'],
209 params: [openils.User.authtoken],
210 oncomplete: function(r) {
211 openils.acq.Lineitem.attrDefs =
212 openils.Util.readResponse(r);
213 onload(openils.acq.Lineitem.attrDefs);
220 openils.acq.Lineitem.ModelCache = {};
221 openils.acq.Lineitem.acqlidCache = {};
223 openils.acq.Lineitem.createLIDStore = function(li_id, onComplete) {
224 // Fetches the details of a lineitem and builds a grid
226 function mkStore(r) {
229 while (msg = r.recv()) {
230 var data = msg.content();
231 for (i in data.lineitem_details()) {
232 var lid = data.lineitem_details()[i];
234 openils.acq.Lineitem.acqlidCache[lid.id()] = lid;
238 onComplete(acqlid.toStoreData(items));
241 fieldmapper.standardRequest(
242 ['open-ils.acq', 'open-ils.acq.lineitem.retrieve'],
244 params: [openils.User.authtoken, li_id,
245 {flesh_attrs:1, flesh_li_details:1}],
250 openils.acq.Lineitem.alertOnLIDSet = function(griditem, attr, oldVal, newVal) {
252 var updateDone = function(r) {
253 var stat = r.recv().content();
254 var evt = openils.Event.parse(stat);
257 alert("Error: "+evt.desc);
259 if (attr == "fund") {
261 griditem.fund = oldVal;
262 } else if (attr == "owning_lib") {
263 item.owning_lib(oldVal);
264 griditem.owning_lib = oldVal;
269 if (oldVal == newVal) {
273 item = openils.acq.Lineitem.acqlidCache[griditem.id];
275 if (attr == "fund") {
277 } else if (attr == "owning_lib") {
278 item.owning_lib(newVal);
279 } else if (attr == "cn_label") {
280 item.cn_label(newVal);
281 } else if (attr == "barcode") {
282 item.barcode(newVal);
283 } else if (attr == "location") {
284 item.location(newVal);
286 alert("Unexpected attr in Lineitem.alertOnSet: '"+attr+"'");
290 fieldmapper.standardRequest(
291 ["open-ils.acq", "open-ils.acq.lineitem_detail.update"],
292 { params: [openils.User.authtoken, item],
293 oncomplete: updateDone
297 openils.acq.Lineitem.deleteLID = function(id, onComplete) {
298 fieldmapper.standardRequest(
299 ['open-ils.acq', 'open-ils.acq.lineitem_detail.delete'],
301 params: [openils.User.authtoken, id],
302 oncomplete: function(r) {
304 stat = msg.content();
305 onComplete(openils.Event.parse(stat));
310 openils.acq.Lineitem.createLID = function(fields, onCreateComplete) {
311 var lid = new acqlid()
312 for (var field in fields) {
313 lid[field](fields[field]);
316 fieldmapper.standardRequest(
317 ['open-ils.acq', 'open-ils.acq.lineitem_detail.create'],
319 params: [openils.User.authtoken, lid, {return_obj:1}],
320 oncomplete: function(r) {
322 var obj = msg.content();
323 openils.Event.parse_and_raise(obj);
324 if (onCreateComplete) {
325 onCreateComplete(obj);
331 openils.acq.Lineitem.loadLIDGrid = function(domNode, id, layout) {
332 if (!openils.acq.Lineitem.ModelCache[id]) {
333 openils.acq.Lineitem.createLIDStore(id,
334 function(storeData) {
335 var store = new dojo.data.ItemFileWriteStore({data:storeData});
336 var model = new dojox.grid.data.DojoData(null, store,
337 {rowsPerPage: 20, clientSort:true, query:{id:'*'}});
339 dojo.connect(store, "onSet",
340 openils.acq.Lineitem.alertOnLIDSet);
341 openils.acq.Lineitem.ModelCache[id] = model;
343 domNode.setStructure(layout);
344 domNode.setModel(model);
348 domNode.setModel(openils.acq.Lineitem.ModelCache[id]);
349 domNode.setStructure(layout);