2 * Shared services for patron billing.
6 angular.module('egCoreMod')
9 ['$uibModal','$q','egCore',
10 function($uibModal , $q , egCore) {
14 // fetch a fleshed money.billable_xact
15 service.fetchXact = function(xact_id) {
16 return egCore.pcrud.retrieve('mbt', xact_id, {
19 mbt : ['summary','circulation','grocery','reservation'],
20 circ: ['target_copy'],
21 acp : ['call_number','location','status','age_protect'],
23 bre : ['simple_record']
25 select : {bre : ['id']}}, // avoid MARC
26 {authoritative : true}
30 // apply a patron billing. If no xact is provided, a grocery xact is
32 service.billPatron = function(args, xact) {
33 // apply a billing to an existing transaction
34 if (xact) return service.createBilling(xact.id, args);
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);
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());
48 groc.usr(args.patron_id);
51 return egCore.net.request(
53 'open-ils.circ.money.grocery.create',
54 egCore.auth.token(), groc
56 // create the billing on the new xact
57 ).then(function(xact_id) {
58 if (evt = egCore.evt.parse(xact_id))
64 // fetch the org-focused billing types
66 service.fetchBillingTypes = function() {
68 return $q.when(egCore.env.cbt.list);
71 return egCore.pcrud.search('cbt',
72 { // first 100 are reserved for system-generated bills
74 owner : egCore.org.ancestors(
75 egCore.auth.user().ws_ou(), true)
78 ).then(function(list) {
79 egCore.env.absorbList(list, 'cbt');
84 // create a patron billing
85 service.createBilling = function(xact_id, args) {
86 var bill = new egCore.idl.mb();
88 bill.amount(args.amount);
89 bill.btype(args.billingType);
90 bill.billing_type(egCore.env.cbt.map[args.billingType].name());
93 return egCore.net.request(
95 'open-ils.circ.money.billing.create',
96 egCore.auth.token(), bill
98 // check the billing response
99 ).then(function(bill_id) {
100 if (evt = egCore.evt.parse(bill_id)) {
109 // Show the billing dialog.
110 // Allows users to select amount, billing type, and note.
112 // xact OR xact_id : if null, creates a grocery xact
113 // patron OR patron_id
114 service.showBillDialog = function(args) {
116 return $uibModal.open({
117 templateUrl: './circ/share/t_bill_patron_dialog',
120 ['$scope','$uibModalInstance','$timeout','billingTypes','xact','patron',
121 function($scope , $uibModalInstance , $timeout , billingTypes , xact , patron) {
122 console.debug('billing patron ' + patron.id());
124 if (xact && xact._isfieldmapper)
125 xact = egCore.idl.toHash(xact);
127 $scope.patron = patron;
128 $scope.billingTypes = billingTypes;
129 $scope.location = egCore.org.get(egCore.auth.user().ws_ou()),
131 billingType : 101, // default to stock Misc. billing type
133 patron_id : patron.id()
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());
145 // if we don't already have them, fetch the billing types
146 billingTypes : function() {
147 return service.fetchBillingTypes();
151 if (args.xact) return $q.when(args.xact);
152 if (args.xact_id) return service.fetchXact(args.xact_id);
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']}});
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);