]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/financial/list_funds.js
abad41d987b8a4e78adde3b0b9ae385af72b2f38
[working/Evergreen.git] / Open-ILS / web / js / ui / default / acq / financial / list_funds.js
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');
21
22 var contextOrg;
23 var rolloverResponses;
24 var rolloverMode = false;
25 var fundFleshFields = [
26     'spent_balance', 
27     'combined_balance', 
28     'spent_total', 
29     'encumbrance_total', 
30     'debit_total', 
31     'allocation_total'
32 ];
33
34 var adminPermOrgs = [];
35 var cachedFunds = [];
36
37 function initPage() {
38     contextOrg = openils.User.user.ws_ou();
39
40     /* Reveal controls for rollover without money if org units say ok.
41      * Actual ability to do the operation is controlled in the database, of
42      * course. */
43     var ouSettings = fieldmapper.aou.fetchOrgSettingBatch(
44         openils.User.user.ws_ou(), ["acq.fund.allow_rollover_without_money"]
45     );
46     if (
47         ouSettings["acq.fund.allow_rollover_without_money"] &&
48         ouSettings["acq.fund.allow_rollover_without_money"].value
49     ) {
50         dojo.query(".encumb_only").forEach(
51             function(o) { openils.Util.show(o, "table-row"); }
52         );
53     }
54
55     var connect = function() {
56         dojo.connect(contextOrgSelector, 'onChange',
57             function() {
58                 contextOrg = this.attr('value');
59                 dojo.byId('oils-acq-rollover-ctxt-org').innerHTML = 
60                     fieldmapper.aou.findOrgUnit(contextOrg).shortname();
61                 rolloverMode = false;
62                 gridDataLoader();
63             }
64         );
65     };
66
67     dojo.connect(refreshButton, 'onClick', 
68         function() { rolloverMode = false; gridDataLoader(); });
69
70     new openils.User().buildPermOrgSelector(
71         ['ADMIN_ACQ_FUND', 'VIEW_FUND'], 
72         contextOrgSelector, contextOrg, connect);
73
74     dojo.byId('oils-acq-rollover-ctxt-org').innerHTML = 
75         fieldmapper.aou.findOrgUnit(contextOrg).shortname();
76
77     loadYearSelector();
78     lfGrid.onItemReceived = function(item) {cachedFunds.push(item)};
79
80     new openils.User().getPermOrgList(
81         'ADMIN_ACQ_FUND',
82         function(list) {
83             adminPermOrgs = list;
84             loadFundGrid(
85                 new openils.CGI().param('year') 
86                     || new Date().getFullYear().toString());
87         },
88         true, true
89     );
90 }
91
92 function gridDataLoader() {
93     lfGrid.resetStore();
94     if(rolloverMode) {
95         var offset = lfGrid.displayOffset;
96         for(var i = offset; i < (offset + lfGrid.displayLimit - 1); i++) {
97             var fund = rolloverResponses[i];
98             if(!fund) break;
99             lfGrid.store.newItem(fieldmapper.acqf.toStoreItem(fund));
100         }
101     } else {
102         loadFundGrid();
103     }
104 }
105
106 function getBalanceInfo(rowIdx, item) {
107     if (!item) return '';
108     var fundId = this.grid.store.getValue(item, 'id');
109     var fund = cachedFunds.filter(function(f) { return f.id() == fundId })[0];
110     var cb = fund.combined_balance();
111     return cb ? cb.amount() : '0';
112 }
113
114 function loadFundGrid(year) {
115     openils.Util.hide('acq-fund-list-rollover-summary');
116     year = year || fundFilterYearSelect.attr('value');
117     cachedFunds = [];
118
119     lfGrid.loadAll(
120         {
121             flesh : 1,  
122             flesh_fields : {acqf : fundFleshFields},
123             
124             // by default, sort funds I can edit to the front
125             order_by : [
126                 {   'class' : 'acqf',
127                     field : 'org',
128                     compare : {'in' : adminPermOrgs},
129                     direction : 'desc'
130                 },
131                 {   'class' : 'acqf',
132                     field : 'name'
133                 }
134             ]
135         }, {   
136             year : year, 
137             org : fieldmapper.aou.descendantNodeList(contextOrg, true) 
138         } 
139     );
140 }
141
142 function loadYearSelector() {
143
144     fieldmapper.standardRequest(
145         ['open-ils.acq', 'open-ils.acq.fund.org.years.retrieve'],
146         {   async : true,
147             params : [openils.User.authtoken, {}, {limit_perm : 'VIEW_FUND'}],
148             oncomplete : function(r) {
149
150                 var yearList = openils.Util.readResponse(r);
151                 if(!yearList) return;
152                 yearList = yearList.map(function(year){return {year:year+''};}); // dojo wants strings
153
154                 var yearStore = {identifier:'year', name:'year', items:yearList};
155                 yearStore.items = yearStore.items.sort().reverse();
156                 fundFilterYearSelect.store = new dojo.data.ItemFileWriteStore({data:yearStore});
157
158                 // default to this year
159                 fundFilterYearSelect.setValue(new Date().getFullYear().toString());
160
161                 dojo.connect(
162                     fundFilterYearSelect, 
163                     'onChange', 
164                     function() { 
165                         rolloverMode = false;
166                         gridDataLoader();
167                     }
168                 );
169             }
170         }
171     );
172 }
173
174 function performRollover(args) {
175
176     rolloverMode = true;
177     progressDialog.show(true, "Processing...");
178     rolloverResponses = [];
179
180     var method = 'open-ils.acq.fiscal_rollover';
181
182     if(args.rollover[0] == 'on') {
183         method += '.combined';
184     } else {
185         method += '.propagate';
186     }
187         
188     var dryRun = args.dry_run[0] == 'on';
189     if(dryRun) method += '.dry_run';
190
191     var encumbOnly = args.encumb_only[0] == 'on';
192
193     var count = 0;
194     var amount_rolled = 0;
195     var year = fundFilterYearSelect.attr('value'); // TODO alternate selector?
196     
197     fieldmapper.standardRequest(
198         ['open-ils.acq', method],
199         {
200             async : true,
201
202             params : [
203                 openils.User.authtoken, 
204                 year,
205                 contextOrg,
206                 (args.child_orgs[0] == 'on'),
207                 { encumb_only : encumbOnly }
208             ],
209
210             onresponse : function(r) {
211                 var resp = openils.Util.readResponse(r);
212                 rolloverResponses.push(resp.fund);
213                 count += 1;
214                 amount_rolled += Number(resp.rollover_amount);
215             }, 
216
217             oncomplete : function() {
218                 
219                 var nextYear = Number(year) + 1;
220                 rolloverResponses = rolloverResponses.sort(
221                     function(a, b) {
222                         if(a.code() > b.code())
223                             return 1;
224                         return -1;
225                     }
226                 )
227
228                 // add the new, rolled funds to the cache.  Note that in dry-run 
229                 // mode, these are ephemeral and no longer exist on the server.
230                 cachedFunds = cachedFunds.concat(rolloverResponses);
231
232                 dojo.byId('acq-fund-list-rollover-summary-header').innerHTML = 
233                     dojo.string.substitute(
234                         localeStrings.FUND_LIST_ROLLOVER_SUMMARY,
235                         [nextYear]
236                     );
237
238                 dojo.byId('acq-fund-list-rollover-summary-funds').innerHTML = 
239                     dojo.string.substitute(
240                         localeStrings.FUND_LIST_ROLLOVER_SUMMARY_FUNDS,
241                         [nextYear, count]
242                     );
243
244                 dojo.byId('acq-fund-list-rollover-summary-rollover-amount').innerHTML = 
245                     dojo.string.substitute(
246                         localeStrings.FUND_LIST_ROLLOVER_SUMMARY_ROLLOVER_AMOUNT,
247                         [nextYear, amount_rolled]
248                     );
249
250                 if(!dryRun) {
251                     openils.Util.hide('acq-fund-list-rollover-summary-dry-run');
252                     
253                     // add the new year to the year selector if it's not already there
254                     fundFilterYearSelect.store.fetch({
255                         query : {year : nextYear}, 
256                         onComplete:
257                             function(list) {
258                                 if(list && list.length > 0) return;
259                                 fundFilterYearSelect.store.newItem({year : nextYear});
260                             }
261                     });
262                 }
263
264                 openils.Util.show('acq-fund-list-rollover-summary');
265                 progressDialog.hide();
266                 gridDataLoader();
267             }
268         }
269     );
270 }
271
272 openils.Util.addOnLoad(initPage);