1 import {Injectable} from '@angular/core';
2 import {AuthService} from '@eg/core/auth.service';
3 import {EventService} from '@eg/core/event.service';
4 import {IdlObject, IdlService} from '@eg/core/idl.service';
5 import {NetService} from '@eg/core/net.service';
6 import {OrgService} from '@eg/core/org.service';
7 import {PcrudService} from '@eg/core/pcrud.service';
10 export class CourseService {
13 private auth: AuthService,
14 private evt: EventService,
15 private idl: IdlService,
16 private net: NetService,
17 private org: OrgService,
18 private pcrud: PcrudService
21 isOptedIn(): Promise<any> {
22 return new Promise((resolve, reject) => {
23 this.org.settings('circ.course_materials_opt_in').then(res => {
24 resolve(res['circ.course_materials_opt_in']);
28 getCourses(course_ids?: Number[]): Promise<IdlObject[]> {
30 return this.pcrud.retrieveAll('acmc',
31 {}, {atomic: true}).toPromise();
33 return this.pcrud.search('acmc', {id: course_ids},
34 {}, {atomic: true}).toPromise();
38 getMaterials(course_ids?: Number[]): Promise<IdlObject[]> {
40 return this.pcrud.retrieveAll('acmcm',
41 {}, {atomic: true}).toPromise();
43 return this.pcrud.search('acmcm', {course: course_ids},
44 {}, {atomic: true}).toPromise();
48 getUsers(course_ids?: Number[]): Promise<IdlObject[]> {
50 return this.pcrud.retrieveAll('acmcu',
51 {}, {atomic: true}).toPromise();
53 return this.pcrud.search('acmcu', {course: course_ids},
54 {}, {atomic: true}).toPromise();
58 fleshMaterial(material): Promise<any> {
60 return new Promise((resolve, reject) => {
61 let item = this.idl.create('acp');
64 'open-ils.circ.copy_details.retrieve',
65 this.auth.token(), material.item()
67 if (res && res.copy) {
69 item.call_number(res.volume);
70 item._title = res.mvr.title();
71 item.circ_lib(this.org.get(item.circ_lib()));
72 item._id = material.id();
73 if (material.relationship())
74 item._relationship = material.relationship();
78 }, () => resolve(item));
82 fleshUser(course_user): Promise<any> {
83 return new Promise((resolve, reject) => {
84 let user = this.idl.create('au');
87 'open-ils.actor.user.fleshed.retrieve',
88 this.auth.token(), course_user.usr()
89 ).subscribe(patron => {
91 user._id = course_user.id();
92 if (course_user.usr_role()) user._role = course_user.usr_role();
93 if (course_user.is_public()) user._is_public = course_user.is_public();
96 }, () => resolve(user));
100 getCoursesFromMaterial(copy_id): Promise<any> {
102 return new Promise((resolve, reject) => {
104 return this.pcrud.search('acmcm', {item: copy_id})
105 .subscribe(materials => {
107 id_list.push(materials.course());
113 if (id_list.length) {
114 return this.getCourses(id_list).then(courses => {
123 fetchCopiesInCourseFromRecord(record_id) {
125 let course_list = [];
126 return new Promise((resolve, reject) => {
129 'open-ils.cat.asset.copy_tree.global.retrieve',
130 this.auth.token(), record_id
131 ).subscribe(copy_tree => {
132 copy_tree.forEach(cn => {
133 cn.copies().forEach(cp => {
134 cp_list.push(cp.id());
137 }, err => reject(err),
139 resolve(this.getCoursesFromMaterial(cp_list));
144 // Creating a new acmcm Entry
145 associateMaterials(item, args) {
146 let material = this.idl.create('acmcm');
147 material.item(item.id());
148 if (item.call_number() && item.call_number().record()) {
149 material.record(item.call_number().record());
151 material.course(args.currentCourse.id());
152 if (args.relationship) material.relationship(args.relationship);
154 // Apply temporary fields to the item
155 if (args.isModifyingStatus && args.tempStatus) {
156 material.original_status(item.status());
157 item.status(args.tempStatus);
159 if (args.isModifyingLocation && args.tempLocation) {
160 material.original_location(item.location());
161 item.location(args.tempLocation);
163 if (args.isModifyingCircMod) {
164 material.original_circ_modifier(item.circ_modifier());
165 item.circ_modifier(args.tempCircMod);
166 if (!args.tempCircMod) item.circ_modifier(null);
168 if (args.isModifyingCallNumber) {
169 material.original_callnumber(item.call_number());
173 material: this.pcrud.create(material).toPromise()
179 associateUsers(patron_id, args) {
180 let new_user = this.idl.create('acmcu');
181 if (args.is_public) new_user.is_public(args.is_public);
182 if (args.role) new_user.usr_role(args.role);
183 new_user.course(args.currentCourse.id());
184 new_user.usr(patron_id);
185 return this.pcrud.create(new_user).toPromise()
188 disassociateMaterials(courses) {
189 return new Promise((resolve, reject) => {
191 let course_library_hash = {};
192 courses.forEach(course => {
193 course_ids.push(course.id());
194 course_library_hash[course.id()] = course.owning_lib();
196 this.pcrud.search('acmcm', {course: course_ids}).subscribe(material => {
197 material.isdeleted(true);
198 this.resetItemFields(material, course_library_hash[material.course()]);
199 this.pcrud.autoApply(material).subscribe(res => {
213 disassociateUsers(user) {
214 return new Promise((resolve, reject) => {
216 let course_library_hash = {};
217 user.forEach(course => {
218 user_ids.push(course.id());
219 course_library_hash[course.id()] = course.owning_lib();
221 this.pcrud.search('acmcu', {user: user_ids}).subscribe(user => {
222 user.course(user_ids);
223 this.pcrud.autoApply(user).subscribe(res => {
238 resetItemFields(material, course_lib) {
239 this.pcrud.retrieve('acp', material.item(),
240 {flesh: 3, flesh_fields: {acp: ['call_number']}}).subscribe(copy => {
241 if (material.original_status()) {
242 copy.status(material.original_status());
244 if (copy.circ_modifier() != material.original_circ_modifier()) {
245 copy.circ_modifier(material.original_circ_modifier());
247 if (material.original_location()) {
248 copy.location(material.original_location());
250 if (material.original_callnumber()) {
251 this.pcrud.retrieve('acn', material.original_callnumber()).subscribe(cn => {
252 this.updateItem(copy, course_lib, cn.label(), true);
255 this.updateItem(copy, course_lib, copy.call_number().label(), false);
260 updateItem(item: IdlObject, course_lib, call_number, updatingVolume) {
261 return new Promise((resolve, reject) => {
262 this.pcrud.update(item).subscribe(item_id => {
263 if (updatingVolume) {
264 let cn = item.call_number();
265 return this.net.request(
266 'open-ils.cat', 'open-ils.cat.call_number.find_or_create',
267 this.auth.token(), call_number, cn.record(),
268 course_lib, cn.prefix(), cn.suffix(),
271 let event = this.evt.parse(res);
273 return this.net.request(
274 'open-ils.cat', 'open-ils.cat.transfer_copies_to_volume',
275 this.auth.token(), res.acn_id, [item.id()]
276 ).subscribe(transfered_res => {
277 console.debug("Copy transferred to volume with code " + transfered_res);
289 this.pcrud.update(item).subscribe(rse => {