1 dojo.require("dijit.Dialog");
2 dojo.require("dijit.form.FilteringSelect");
3 dojo.require('dijit.form.Button');
4 dojo.require('dijit.TooltipDialog');
5 dojo.require('dijit.form.DropDownButton');
6 dojo.require('dijit.form.CheckBox');
7 dojo.require('dojox.grid.DataGrid');
8 dojo.require('dojo.data.ItemFileWriteStore');
9 dojo.require('openils.widget.OrgUnitFilteringSelect');
10 dojo.require('openils.acq.CurrencyType');
11 dojo.require('openils.Event');
12 dojo.require('openils.Util');
13 dojo.require('openils.User');
14 dojo.require('openils.CGI');
15 dojo.require('openils.PermaCrud');
16 dojo.require('openils.widget.AutoGrid');
17 dojo.require('openils.widget.ProgressDialog');
18 dojo.require('fieldmapper.OrgUtils');
19 dojo.requireLocalization('openils.acq', 'acq');
20 var localeStrings = dojo.i18n.getLocalization('openils.acq', 'acq');
22 dojo.require('openils.XUL');
23 var xulStorage = openils.XUL.localStorage();
24 var storekey = 'eg.acq.fund.list.context_ou_selector';
27 var rolloverResponses;
28 var rolloverMode = false;
29 var fundFleshFields = [
38 var adminPermOrgs = [];
42 contextOrg = xulStorage.getItem(storekey) || openils.User.user.ws_ou();
44 // Propagate the context org from the URL data into our org selector.
45 if (lfGrid.urlUserData && lfGrid.urlUserData.contextOrg)
46 contextOrg = lfGrid.urlUserData.contextOrg;
48 /* Reveal controls for rollover without money if org units say ok.
49 * Actual ability to do the operation is controlled in the database, of
51 var ouSettings = fieldmapper.aou.fetchOrgSettingBatch(
52 openils.User.user.ws_ou(), ["acq.fund.allow_rollover_without_money"]
55 ouSettings["acq.fund.allow_rollover_without_money"] &&
56 ouSettings["acq.fund.allow_rollover_without_money"].value
58 dojo.query(".encumb_only").forEach(
59 function(o) { openils.Util.show(o, "table-row"); }
63 var connect = function() {
64 dojo.connect(contextOrgSelector, 'onChange',
66 contextOrg = this.attr('value');
67 xulStorage.setItem(storekey, contextOrg);
68 dojo.byId('oils-acq-rollover-ctxt-org').innerHTML =
69 fieldmapper.aou.findOrgUnit(contextOrg).shortname();
71 // tell the grid to pass the context org info along
72 // with the encoded URL data so we can re-propagate
73 lfGrid.displayOffset = 0; // new org means a new search
79 dojo.connect(refreshButton, 'onClick',
80 function() { rolloverMode = false; gridDataLoader(); });
82 new openils.User().buildPermOrgSelector(
83 ['ADMIN_ACQ_FUND', 'VIEW_FUND'],
84 contextOrgSelector, contextOrg, connect);
86 dojo.byId('oils-acq-rollover-ctxt-org').innerHTML =
87 fieldmapper.aou.findOrgUnit(contextOrg).shortname();
90 lfGrid.onItemReceived = function(item) {cachedFunds.push(item)};
92 new openils.User().getPermOrgList(
97 lfGrid.urlUserData.year
98 || new openils.CGI().param('year')
99 || new Date().getFullYear().toString());
105 function gridDataLoader() {
108 var offset = lfGrid.displayOffset;
109 for(var i = offset; i < (offset + lfGrid.displayLimit - 1); i++) {
110 var fund = rolloverResponses[i];
112 lfGrid.store.newItem(fieldmapper.acqf.toStoreItem(fund));
119 function getBalanceInfo(rowIdx, item) {
120 if (!item) return '';
121 var fundId = this.grid.store.getValue(item, 'id');
122 var fund = cachedFunds.filter(function(f) { return f.id() == fundId })[0];
123 var cb = fund.combined_balance();
124 return cb ? cb.amount() : '0';
127 function loadFundGrid(year) {
128 openils.Util.hide('acq-fund-list-rollover-summary');
129 year = year || fundFilterYearSelect.attr('value');
132 var order_by = [{'class' : 'acqf', field : 'name'}];
134 if (adminPermOrgs.length) {
135 // sort funds I can edit to the front
139 compare : {'in' : adminPermOrgs},
144 lfGrid.urlUserData.year = year;
145 lfGrid.urlUserData.contextOrg = contextOrg;
150 flesh_fields : {acqf : fundFleshFields},
154 org : fieldmapper.aou.descendantNodeList(contextOrg, true)
159 function loadYearSelector() {
161 fieldmapper.standardRequest(
162 ['open-ils.acq', 'open-ils.acq.fund.org.years.retrieve'],
164 params : [openils.User.authtoken, {}, {limit_perm : 'VIEW_FUND'}],
165 oncomplete : function(r) {
167 var yearList = openils.Util.readResponse(r);
168 if(!yearList) return;
169 yearList = yearList.map(function(year){return {year:year+''};}); // dojo wants strings
171 var yearStore = {identifier:'year', name:'year', items:yearList};
172 yearStore.items = yearStore.items.sort().reverse();
173 fundFilterYearSelect.store = new dojo.data.ItemFileWriteStore({data:yearStore});
175 // default to this year
176 fundFilterYearSelect.setValue(
177 // propagate year from URL if available
178 lfGrid.urlUserData.year ||
179 new Date().getFullYear().toString()
183 fundFilterYearSelect,
186 rolloverMode = false;
187 lfGrid.displayOffset = 0;
196 function performRollover(args) {
199 progressDialog.show(true, "Processing...");
200 rolloverResponses = [];
202 var method = 'open-ils.acq.fiscal_rollover';
204 if(args.rollover[0] == 'on') {
205 method += '.combined';
207 method += '.propagate';
210 var dryRun = args.dry_run[0] == 'on';
211 if(dryRun) method += '.dry_run';
213 var encumbOnly = args.encumb_only[0] == 'on';
216 var amount_rolled = 0;
217 var year = fundFilterYearSelect.attr('value'); // TODO alternate selector?
219 fieldmapper.standardRequest(
220 ['open-ils.acq', method],
225 openils.User.authtoken,
228 (args.child_orgs[0] == 'on'),
229 { encumb_only : encumbOnly }
232 onresponse : function(r) {
233 var resp = openils.Util.readResponse(r);
234 rolloverResponses.push(resp.fund);
236 amount_rolled += Number(resp.rollover_amount);
239 oncomplete : function() {
241 var nextYear = Number(year) + 1;
242 rolloverResponses = rolloverResponses.sort(
244 if(a.code() > b.code())
250 // add the new, rolled funds to the cache. Note that in dry-run
251 // mode, these are ephemeral and no longer exist on the server.
252 cachedFunds = cachedFunds.concat(rolloverResponses);
254 dojo.byId('acq-fund-list-rollover-summary-header').innerHTML =
255 dojo.string.substitute(
256 localeStrings.FUND_LIST_ROLLOVER_SUMMARY,
260 dojo.byId('acq-fund-list-rollover-summary-funds').innerHTML =
261 dojo.string.substitute(
262 localeStrings.FUND_LIST_ROLLOVER_SUMMARY_FUNDS,
263 [nextYear, '<b>' + count + '</b>']
266 dojo.byId('acq-fund-list-rollover-summary-rollover-amount').innerHTML =
267 dojo.string.substitute(
268 localeStrings.FUND_LIST_ROLLOVER_SUMMARY_ROLLOVER_AMOUNT,
269 [nextYear, '<b>' + amount_rolled + '</b>']
273 openils.Util.hide('acq-fund-list-rollover-summary-dry-run');
275 // add the new year to the year selector if it's not already there
276 fundFilterYearSelect.store.fetch({
277 query : {year : ''+nextYear},
280 if(list && list.length > 0) return;
281 fundFilterYearSelect.store.newItem({year : nextYear});
286 openils.Util.show('acq-fund-list-rollover-summary');
287 progressDialog.hide();
294 openils.Util.addOnLoad(initPage);