]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/circ/services/billing.js
3abd6da57d2600ef3cee57d85a8dbfe6e4d8c73a
[Evergreen.git] / Open-ILS / web / js / ui / default / staff / circ / services / billing.js
1 /**
2  * Shared services for patron billing.
3  * 
4  */
5
6 angular.module('egCoreMod')
7
8 .factory('egBilling', 
9        ['$uibModal','$q','egCore',
10 function($uibModal , $q , egCore) {
11
12     var service = {};
13
14     // fetch a fleshed money.billable_xact
15     service.fetchXact = function(xact_id) {
16         return egCore.pcrud.retrieve('mbt', xact_id, {
17             flesh : 5,
18             flesh_fields : {
19                 mbt : ['summary','circulation','grocery','reservation'],
20                 circ: ['target_copy'],
21                 acp : ['call_number','location','status','age_protect'],
22                 acn : ['record'],
23                 bre : ['simple_record']
24             },
25             select : {bre : ['id']}}, // avoid MARC
26             {authoritative : true}
27         );
28     }
29
30     // apply a patron billing.  If no xact is provided, a grocery xact is
31     // created.
32     service.billPatron = function(args, xact) {
33         // apply a billing to an existing transaction
34         if (xact) return service.createBilling(xact.id, args);
35
36         // create a new grocery xact, then apply a billing
37         return service.createGroceryXact(args)
38         .then(function(xact_id) { 
39             return service.createBilling(xact_id, args);
40         });
41     }
42
43     // create a new grocery xact
44     service.createGroceryXact = function(args) {
45         var groc = new egCore.idl.mg();
46         groc.billing_location(egCore.auth.user().ws_ou());
47         groc.note(args.note);
48         groc.usr(args.patron_id);
49         
50         // create the xact
51         return egCore.net.request(
52             'open-ils.circ',
53             'open-ils.circ.money.grocery.create',
54             egCore.auth.token(), groc
55
56         // create the billing on the new xact
57         ).then(function(xact_id) {
58             if (evt = egCore.evt.parse(xact_id)) 
59                 return alert(evt);
60             return xact_id;
61         });
62     }
63
64     // fetch the org-focused billing types
65     // Cache on egEnv
66     service.fetchBillingTypes = function() {
67         if (egCore.env.cbt) {
68             return $q.when(egCore.env.cbt.list);
69         }
70
71         return egCore.pcrud.search('cbt', 
72             {   // first 100 are reserved for system-generated bills
73                 id : {'>' : 100}, 
74                 owner : egCore.org.ancestors(
75                     egCore.auth.user().ws_ou(), true)
76             }, 
77             {}, {atomic : true}
78         ).then(function(list) {
79             egCore.env.absorbList(list, 'cbt');
80             return list;
81         });
82     }
83
84     // create a patron billing
85     service.createBilling = function(xact_id, args) {
86         var bill = new egCore.idl.mb();
87         bill.xact(xact_id);
88         bill.amount(args.amount);
89         bill.btype(args.billingType);
90         bill.billing_type(egCore.env.cbt.map[args.billingType].name());
91         bill.note(args.note);
92
93         return egCore.net.request(
94             'open-ils.circ', 
95             'open-ils.circ.money.billing.create',
96             egCore.auth.token(), bill
97
98         // check the billing response
99         ).then(function(bill_id) {
100             if (evt = egCore.evt.parse(bill_id)) {
101                 alert(evt);
102             } else {
103                 return bill_id;
104             }
105         });
106     }
107
108
109     // Show the billing dialog.  
110     // Allows users to select amount, billing type, and note.
111     // args:
112     //   xact OR xact_id : if null, creates a grocery xact
113     //   patron OR patron_id
114     service.showBillDialog = function(args) {
115
116         return $uibModal.open({
117             templateUrl: './circ/share/t_bill_patron_dialog',
118             backdrop: 'static',
119             controller: 
120                    ['$scope','$uibModalInstance','$timeout','billingTypes','xact','patron',
121             function($scope , $uibModalInstance , $timeout , billingTypes , xact , patron) {
122                 console.debug('billing patron ' + patron.id());
123                 $scope.focus = true;
124                 if (xact && xact._isfieldmapper)
125                     xact = egCore.idl.toHash(xact);
126                 $scope.xact = xact;
127                 $scope.patron = patron;
128                 $scope.billingTypes = billingTypes;
129                 $scope.location = egCore.org.get(egCore.auth.user().ws_ou()),
130                 $scope.billArgs = {
131                     billingType : 101, // default to stock Misc. billing type
132                     xact : xact,
133                     patron_id : patron.id()
134                 }
135                 $scope.ok = function(args) { $uibModalInstance.close(args) }
136                 $scope.cancel = function () { $uibModalInstance.dismiss() }
137                 $scope.updateDefaultPrice = function() {
138                     var type = billingTypes.filter(function(t) {
139                         return t.id() == $scope.billArgs.billingType })[0];
140                     if (type.default_price() && !$scope.billArgs.amount) 
141                         $scope.billArgs.amount = Number(type.default_price());
142                 }
143             }],
144             resolve : {
145                 // if we don't already have them, fetch the billing types
146                 billingTypes : function() {
147                     return service.fetchBillingTypes();
148                 }, 
149
150                 xact : function() {
151                     if (args.xact) return $q.when(args.xact);
152                     if (args.xact_id) return service.fetchXact(args.xact_id);
153                     return $q.when();
154                 },
155
156                 patron : function() {
157                     if (args.patron) return $q.when(args.patron);
158                     return  egCore.pcrud.retrieve('au', args.patron_id,
159                         {flesh : 1, flesh_fields : {au : ['card']}});
160                 }
161
162             }
163         }).result.then(
164             function(args) {
165                 // send the billing to the server using the arguments
166                 // provided in the billing dialog, then refresh
167                 return service.billPatron(args, args.xact);
168             }
169         );
170     }
171
172     return service;
173 }]);
174