1 dojo.require("dojo.string");
2 dojo.require('dijit.layout.ContentPane');
3 dojo.require('openils.User');
4 dojo.require('openils.Util');
5 dojo.require('openils.PermaCrud');
7 var pcrud = new openils.PermaCrud();
12 function AcqPoNoteTable() {
15 this.notesTbody = dojo.byId("acq-po-notes-tbody");
16 this.notesRow = this.notesTbody.removeChild(dojo.byId("acq-po-notes-row"));
18 dojo.byId("acq-po-notes-back-button").onclick = function() { self.hide(); };
19 dojo.byId("acq-po-view-notes").onclick = function() { self.show(); };
21 /* widgets' event properties are cased likeThis */
22 acqPoCreateNoteSubmit.onClick = function() {
23 if (!acqPoCreateNoteText.attr("value")) return;
26 var note = new acqpon();
28 Boolean(acqPoCreateNoteVendorPublic.attr('checked'))
30 note.value(acqPoCreateNoteText.attr("value"));
31 note.purchase_order(PO.id());
35 self.updatePoNotes(note);
37 /* reset fields for next use */
38 acqPoCreateNoteText.attr("value", "");
39 acqPoCreateNoteVendorPublic.attr("checked", false);
42 this.drawPoNote = function(note) {
46 var row = dojo.clone(this.notesRow);
48 nodeByName("value", row).innerHTML = note.value();
50 if (openils.Util.isTrue(note.vendor_public()))
51 nodeByName("vendor_public", row).innerHTML =
52 localeStrings.VENDOR_PUBLIC;
54 nodeByName("delete", row).onclick = function() {
56 self.notesTbody.removeChild(row);
60 if (note.edit_time()) {
61 nodeByName("edit_time", row).innerHTML =
62 dojo.date.locale.format(
63 dojo.date.stamp.fromISOString(note.edit_time()),
64 {"formatLength": "short"}
68 self.notesTbody.appendChild(row);
71 this.drawPoNotes = function() {
76 return (a.edit_time() < b.edit_time()) ? 1 : -1;
81 /* remove old renderings of notes */
82 dojo.empty(this.notesTbody);
84 PO.notes().forEach(function(o) { self.drawPoNote(o); });
87 this.updatePoNotesCount = function() {
88 dojo.byId("acq-po-view-notes").innerHTML = PO.notes().length;
91 this.updatePoNotes = function(newNote) {
96 if (o.ischanged() || o.isnew() || o.isdeleted())
101 if (notes.length < 1)
104 progressDialog.show();
106 fieldmapper.standardRequest(
107 ["open-ils.acq", "open-ils.acq.po_note.cud.batch"], {
109 "params": [openils.User.authtoken, notes],
110 "onresponse": function(r) {
111 var resp = openils.Util.readResponse(r);
113 progressDialog.update(resp);
115 if (!resp.note.isdeleted()) {
116 resp.note.isnew(false);
117 resp.note.ischanged(false);
118 PO.notes().push(resp.note);
122 "oncomplete": function() {
124 /* remove the old changed notes */
130 o.ischanged() || o.isnew() ||
138 progressDialog.hide();
139 self.updatePoNotesCount();
146 this.hide = function() {
147 openils.Util.hide("acq-po-notes-div");
148 liTable.show("list");
151 this.show = function() {
154 openils.Util.show("acq-po-notes-div");
158 function updatePoState(po_info) {
159 var data = po_info[PO.id()];
161 for (var key in data)
167 function cancellationUpdater(r) {
168 var r = openils.Util.readResponse(r);
170 if (r.po) updatePoState(r.po);
172 for (var id in r.li) {
173 liTable.liCache[id].state(r.li[id].state);
174 liTable.liCache[id].cancel_reason(r.li[id].cancel_reason);
175 liTable.updateLiState(liTable.liCache[id]);
178 if (r.lid && liTable.copyCache) {
179 for (var id in r.lid) {
180 if (liTable.copyCache[id]) {
181 liTable.copyCache[id].cancel_reason(
182 r.lid[id].cancel_reason
184 liTable.updateLidState(liTable.copyCache[id]);
191 function makeProviderLink(node, provider) {
194 "href": "/eg/conify/global/acq/provider/" + provider.id(),
195 "innerHTML": provider.name() + " (" + provider.code() + ")",
201 function makePrepayWidget(node, prepay) {
203 openils.Util.addCSSClass(node, "oils-acq-po-prepay");
204 node.innerHTML = localeStrings.YES;
206 openils.Util.removeCSSClass(node, "oils-acq-po-prepay");
207 node.innerHTML = localeStrings.NO;
211 function makeCancelWidget(node, labelnode) {
212 openils.Util.hide("acq-po-choose-cancel-reason");
214 if (PO.cancel_reason()) {
215 labelnode.innerHTML = localeStrings.CANCEL_REASON;
216 node.innerHTML = PO.cancel_reason().description() + " (" +
217 PO.cancel_reason().label() + ")";
218 } else if (["on-order", "pending"].indexOf(PO.state()) == -1) {
219 dojo.destroy(this.oldTip);
220 labelnode.innerHTML = "";
223 dojo.destroy(this.oldTip);
224 labelnode.innerHTML = localeStrings.CANCEL;
226 if (!acqPoCancelReasonSubmit._prepared) {
227 var widget = new openils.widget.AutoFieldWidget({
228 "fmField": "cancel_reason",
230 "parentNode": dojo.byId("acq-po-cancel-reason"),
231 "orgLimitPerms": ["CREATE_PURCHASE_ORDER"],
236 acqPoCancelReasonSubmit.onClick = function() {
237 if (w.attr("value")) {
238 if (confirm(localeStrings.PO_CANCEL_CONFIRM)) {
239 fieldmapper.standardRequest(
241 "open-ils.acq.purchase_order.cancel"],
244 openils.User.authtoken,
249 "oncomplete": cancellationUpdater
255 acqPoCancelReasonSubmit._prepared = true;
259 openils.Util.show("acq-po-choose-cancel-reason", "inline");
263 function renderPo() {
264 dojo.byId("acq-po-view-id").innerHTML = PO.id();
265 dojo.byId("acq-po-view-name").innerHTML = PO.name();
267 dojo.byId("acq-po-view-provider"),
270 dojo.byId("acq-po-view-total-li").innerHTML = PO.lineitem_count();
271 dojo.byId("acq-po-view-total-enc").innerHTML = PO.amount_encumbered();
272 dojo.byId("acq-po-view-total-spent").innerHTML = PO.amount_spent();
273 dojo.byId("acq-po-view-state").innerHTML = PO.state(); // TODO i18n
275 dojo.byId("acq-po-view-prepay"),
276 openils.Util.isTrue(PO.prepayment_required())
279 dojo.byId("acq-po-view-cancel-reason"),
280 dojo.byId("acq-po-cancel-label")
282 dojo.byId("acq-po-view-notes").innerHTML = PO.notes().length;
284 if(PO.state() == "pending") {
285 openils.Util.show("acq-po-activate", "table-row");
286 checkCouldActivatePo();
287 if (PO.lineitem_count() > 1)
288 openils.Util.show("acq-po-split");
291 dojo.byId('acq-po-create-invoice-link').onclick =
293 location.href = oilsBasePath + '/acq/invoice/view?create=1&attach_po=' + poId;
296 dojo.byId("acq-po-view-invoice-link").onclick =
298 location.href = oilsBasePath + "/acq/search/unified?so=" +
299 base64Encode({"jub":[{"purchase_order": PO.id()}]}) +
306 /* set up li table */
307 liTable = new AcqLiTable();
310 liTable.poUpdateCallback = updatePoState;
312 /* set up po notes table */
313 poNoteTable = new AcqPoNoteTable();
315 /* retrieve data and populate */
316 fieldmapper.standardRequest(
317 ['open-ils.acq', 'open-ils.acq.purchase_order.retrieve'],
319 params: [openils.User.authtoken, poId, {
320 "flesh_provider": true,
321 "flesh_price_summary": true,
322 "flesh_lineitem_count": true,
325 oncomplete: function(r) {
326 PO = openils.Util.readResponse(r); /* save PO globally */
332 fieldmapper.standardRequest(
333 ['open-ils.acq', 'open-ils.acq.lineitem.search'],
335 params: [openils.User.authtoken, {purchase_order:poId}, {flesh_attrs:true, flesh_notes:true, flesh_cancel_reason:true}],
336 onresponse: function(r) {
337 liTable.show('list');
338 liTable.addLineitem(openils.Util.readResponse(r));
344 function checkCouldActivatePo() {
345 var d = dojo.byId("acq-po-activate-checking");
346 var a = dojo.byId("acq-po-activate-link");
347 d.innerHTML = localeStrings.PO_CHECKING;
351 fieldmapper.standardRequest(
352 ["open-ils.acq", "open-ils.acq.purchase_order.activate.dry_run"], {
353 "params": [openils.User.authtoken, PO.id()],
355 "onresponse": function(r) {
356 if ((r = openils.Util.readResponse(r, true /* eventOk */))) {
357 if (typeof(r.textcode) != "undefined") {
359 case "ACQ_FUND_EXCEEDS_STOP_PERCENT":
362 case "ACQ_FUND_EXCEEDS_WARN_PERCENT":
369 "oncomplete": function() {
370 /* XXX in the future, this might be tweaked to display info
371 * about more than one stop or warning event from the ML. */
372 if (!(warnings.length || stops.length)) {
373 d.innerHTML = localeStrings.PO_COULD_ACTIVATE;
374 openils.Util.show(a, "inline");
378 dojo.string.substitute(
379 localeStrings.PO_STOP_BLOCKS_ACTIVATION, [
380 stops[0].payload.fund.code(),
381 stops[0].payload.fund.year()
384 openils.Util.hide(a);
386 PO._warning_hack = true;
388 dojo.string.substitute(
389 localeStrings.PO_WARNING_NO_BLOCK_ACTIVATION, [
390 warnings[0].payload.fund.code(),
391 warnings[0].payload.fund.year()
394 openils.Util.show(a, "inline");
402 function activatePo() {
403 if (openils.Util.isTrue(PO.prepayment_required())) {
404 if (!confirm(localeStrings.PREPAYMENT_REQUIRED_REMINDER))
408 if (PO._warning_hack) {
409 if (!confirm(localeStrings.PO_FUND_WARNING_CONFIRM))
413 progressDialog.show(true);
415 fieldmapper.standardRequest(
416 ['open-ils.acq', 'open-ils.acq.purchase_order.activate'],
418 params: [openils.User.authtoken, PO.id()],
419 oncomplete : function() {
420 location.href = location.href;
425 progressDialog.hide();
430 progressDialog.show(true);
433 fieldmapper.standardRequest(
434 ['open-ils.acq', 'open-ils.acq.purchase_order.split_by_lineitems'],
436 params: [openils.User.authtoken, PO.id()],
437 onresponse : function(r) {
438 list = openils.Util.readResponse(r);
440 oncomplete : function() {
441 progressDialog.hide();
443 location.href = oilsBasePath + '/eg/acq/po/search/' +
450 progressDialog.hide();
455 function updatePoName() {
456 var value = prompt('Enter new purchase order name:', PO.name()); // TODO i18n
457 if(!value || value == PO.name()) return;
460 oncomplete : function(r, cudResults) {
461 var stat = cudResults[0];
463 dojo.byId('acq-po-view-name').innerHTML = value;
468 openils.Util.addOnLoad(init);