displayTextArgs: any;
alertSound: string;
shouldPopup: boolean;
+ previousCirc?: number;
}
@Injectable({providedIn: 'root'})
alertAudio = false;
alertPopup = false;
+ orgSettings: any;
+ overrideCheckoutEvents: string[] = [];
sessionCheckouts: any[] = [];
]);
}).then(sets => {
+ this.orgSettings = sets;
+
const regPattern = sets['opac.barcode_regex'] || /^\d/;
this.barcodeRegex = new RegExp(regPattern);
this.patronPasswordRequired =
this.alertAudio = sets['circ.selfcheck.alert.sound'];
this.alertPopup = sets['circ.selfcheck.alert.popup'];
+ this.overrideCheckoutEvents =
+ sets['circ.selfcheck.auto_override_checkout_events'] || [];
+
this.patronIdleTimeout =
Number(sets['circ.selfcheck.patron_login_timeout'] || 160);
if (evt.textcode === 'SUCCESS') {
checkoutStat.displayText = `scko.${action}.success`;
checkoutStat.alertSound = `success.scko.${action}`;
+ return Promise.resolve(checkoutStat);
+ }
+
+ if (evt.textcode === 'OPEN_CIRCULATION_EXISTS' && action === 'checkout') {
+ return this.handleOpenCirc(checkoutStat, payload, barcode);
}
return Promise.resolve(checkoutStat);
}
+
+ handleOpenCirc(stat: CheckoutStat, payload: any, barcode: string): Promise<any> {
+
+ if (payload.old_circ) {
+ const age = this.orgSettings['circ.checkout_auto_renew_age'];
+
+ if (!age || (age && payload.auto_renew)) {
+ stat.previousCirc = Number(payload.old_circ.id());
+ stat.renew = true;
+ return Promise.resolve(stat);
+ }
+ }
+
+ // LOST items can be checked in and made usable if configured.
+ if (payload.copy
+ && Number(payload.copy.status()) === /* LOST */ 3
+ && this.overrideCheckoutEvents.length
+ && this.overrideCheckoutEvents.includes('COPY_STATUS_LOST')) {
+
+ return this.checkin(barcode).then(ok => {
+ if (ok) {
+ stat.redo = true;
+ } else {
+ stat.shouldPopup = true;
+ stat.alertSound = 'error.scko.checkout';
+ stat.displayText = 'scko.checkout.already_out';
+ }
+
+ return stat;
+ });
+ }
+
+ stat.shouldPopup = true;
+ stat.alertSound = 'error.scko.checkout';
+ stat.displayText = 'scko.checkout.already_out';
+
+ return Promise.resolve(stat);
+ }
+
+ checkin(barcode: string, abortTransit?: boolean): Promise<boolean> {
+
+ let promise = Promise.resolve(true);
+
+ if (abortTransit) {
+
+ promise = this.net.request(
+ 'open-ils.circ',
+ 'open-ils.circ.transit.abort',
+ this.auth.token(), {barcode: barcode}).toPromise()
+
+ .then(resp => {
+
+ console.debug('Transit abort returned', resp);
+ return Number(resp) === 1;
+ });
+ }
+
+ promise = promise.then(ok => {
+ if (!ok) { return false; }
+
+ return this.net.request(
+ 'open-ils.circ',
+ 'open-ils.circ.checkin.override',
+ this.auth.token(), {
+ patron_id : this.patronSummary.id,
+ copy_barcode : barcode,
+ noop : true
+ }
+
+ ).toPromise().then(resp => {
+
+ // If any response events are non-success, report the
+ // checkin as a failure.
+ let success = true;
+ [].concat(resp).forEach(evt => {
+ console.debug('Checkin returned', resp);
+
+ const code = evt.textcode;
+ if (code !== 'SUCCESS' && code !== 'NO_CHANGE') {
+ success = false;
+ }
+ });
+
+ return success;
+
+ });
+ });
+
+ return promise;
+ }
}