1import { 2 EmployeeService 3} from "./chunk-5TGS33NL.js"; 4import { 5 apiTranslations 6} from "./chunk-RVCT4EDL.js"; 7import { 8 DateTime 9} from "./chunk-XYSFEBQZ.js"; 10import { 11 AuthenticationService, 12 Firestore, 13 Timestamp, 14 and, 15 collection2 as collection, 16 collectionSnapshots, 17 doc, 18 docSnapshots, 19 endBefore, 20 environment, 21 getCountFromServer, 22 getDocs2 as getDocs, 23 limit2 as limit, 24 limitToLast, 25 or, 26 orderBy, 27 query2 as query, 28 startAfter, 29 where2 as where, 30 writeBatch 31} from "./chunk-2TSZT3SZ.js"; 32import { 33 Injectable, 34 __async, 35 __spreadProps, 36 __spreadValues, 37 combineLatest, 38 from, 39 map, 40 setClassMetadata, 41 switchMap, 42 take, 43 ɵɵdefineInjectable, 44 ɵɵinject 45} from "./chunk-ZGC4HH7K.js"; 46 47// src/app/_services/meeting.service.ts 48var apiLng = environment.dbLanguage; 49var apiText = apiTranslations[apiLng]; 50var MeetingService = class _MeetingService { 51 constructor(firestore, employeeService, authService) { 52 this.firestore = firestore; 53 this.employeeService = employeeService; 54 this.authService = authService; 55 } 56 /* ============================================ 57 CRUD 58 ============================================ */ 59 createMeeting(meeting) { 60 let ownerName = ""; 61 return this.employeeService.getEmployeeName$(meeting.ownerId).pipe(switchMap((employeeName) => { 62 ownerName = employeeName; 63 return this.authService.getCurrentSession$(); 64 }), switchMap((session) => __async(this, null, function* () { 65 const batch = writeBatch(this.firestore); 66 const meetingRef = doc(collection(this.firestore, "organizations", session.orgId, "meetings")); 67 batch.set(meetingRef, meeting); 68 const scheduledDate = DateTime.fromSeconds(meeting.scheduledDate.seconds); 69 const now = DateTime.now(); 70 let dueDate = Timestamp.fromDate(scheduledDate.minus({ days: 7 }).toJSDate()); 71 if (scheduledDate.diff(now, "days").days <= 7) { 72 dueDate = Timestamp.fromDate(scheduledDate.minus({ hours: 24 }).toJSDate()); 73 } 74 const task = { 75 title: apiText.taskReviewMeetingTitle.replace("{name}", meeting.name), 76 description: apiText.taskReviewMeetingDescription.replace("{scheduledDate}", scheduledDate.toFormat("dd MMM yyyy")).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 77 associatedId: meetingRef.id, 78 associatedLabel: `${meeting.name} meeting`, 79 associatedType: "MEETING", 80 attachments: [], 81 comments: [], 82 completedById: null, 83 ownerRead: null, 84 seenBy: null, 85 completedAt: null, 86 createdAt: Timestamp.now(), 87 documentIds: [meeting.ownerId], 88 dueDate, 89 isCompleted: false, 90 lastUpdatedAt: Timestamp.now(), 91 ownerId: meeting.ownerId, 92 ownerName, 93 ownerType: "EMPLOYER" 94 }; 95 const taskRef = doc(collection(this.firestore, "organizations", session.orgId, "tasks")); 96 batch.set(taskRef, task); 97 const taskTimelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 98 const taskTimeline = { 99 subject: apiText.timelineMeetingSubject.replace("{name}", meeting.name), 100 content: apiText.timelineMeetingContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 101 category: "MEETING_SCHEDULED", 102 createdById: session.employeeId, 103 documentIds: [meeting.ownerId], 104 createdAt: Timestamp.now() 105 }; 106 batch.set(taskTimelineRef, taskTimeline); 107 yield batch.commit(); 108 return meetingRef.id; 109 })), take(1)); 110 } 111 updateMeeting(meetingId, meeting) { 112 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 113 const batch = writeBatch(this.firestore); 114 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 115 batch.update(meetingRef, meeting); 116 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 117 const timeline = {
118 subject: apiText.timelineMeetingUpdateSubject.replace("{name}", meeting.name), 119 content: apiText.timelineMeetingUpdateContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 120 category: "MEETING_UPDATED", 121 createdById: session.employeeId, 122 documentIds: [meetingRef.id], 123 createdAt: Timestamp.now() 124 }; 125 batch.set(timelineRef, timeline); 126 return batch.commit(); 127 }), take(1)); 128 } 129 completeMeeting(meetingId, name) { 130 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 131 const batch = writeBatch(this.firestore); 132 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 133 const body = { 134 lastUpdatedAt: Timestamp.now(), 135 status: "completed" 136 }; 137 batch.update(meetingRef, body); 138 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 139 const timeline = { 140 subject: apiText.timelineMeetingCompleteSubject.replace("{name}", name), 141 content: apiText.timelineMeetingCompleteContent.replace("{name}", name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 142 category: "CYCLE_UPDATED", 143 createdById: session.employeeId, 144 documentIds: [meetingRef.id], 145 createdAt: Timestamp.now() 146 }; 147 batch.set(timelineRef, timeline); 148 return batch.commit(); 149 })); 150 } 151 deleteMeetingQuestion(meeting, meetingId) { 152 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 153 const batch = writeBatch(this.firestore); 154 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 155 batch.update(meetingRef, meeting); 156 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 157 const timeline = { 158 subject: apiText.timelineQuestionDeleteSubject.replace("{name}", meeting.name), 159 content: apiText.timelineQuestionDeleteContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy")).replace("{fullName}", session.fullName), 160 category: "QUESTION_ADDED", 161 createdById: session.employeeId, 162 documentIds: [meetingRef.id], 163 createdAt: Timestamp.now() 164 }; 165 batch.set(timelineRef, timeline); 166 return batch.commit(); 167 }), take(1)); 168 } 169 addMeetingQuestion(meetingId, meeting) { 170 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 171 const batch = writeBatch(this.firestore); 172 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 173 batch.update(meetingRef, meeting); 174 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 175 const timeline = { 176 subject: apiText.timelineQuestionAddSubject.replace("{name}", meeting.name), 177 content: apiText.timelineQuestionAddContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy")).replace("{fullName}", session.fullName), 178 category: "QUESTION_ADDED", 179 createdById: session.employeeId, 180 documentIds: [meetingRef.id], 181 createdAt: Timestamp.now() 182 }; 183 batch.set(timelineRef, timeline); 184 return batch.commit(); 185 }), take(1)); 186 } 187 updateMeetingQuestion(meetingId, meeting, questionText) { 188 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 189 const batch = writeBatch(this.firestore); 190 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 191 batch.update(meetingRef, meeting); 192 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 193 const timeline = { 194 subject: apiText.timelineQuestionSubject.replace("{questionText}", questionText),
195 content: apiText.timelineQuestionContent.replace("{questionText}", questionText).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy")).replace("{fullName}", session.fullName), 196 category: "QUESTION_UPDATED", 197 createdById: session.employeeId, 198 documentIds: [meetingRef.id], 199 createdAt: Timestamp.now() 200 }; 201 batch.set(timelineRef, timeline); 202 return batch.commit(); 203 })); 204 } 205 updateMeetingSummary(meetingId, meeting) { 206 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 207 const batch = writeBatch(this.firestore); 208 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 209 batch.update(meetingRef, meeting); 210 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 211 const timeline = { 212 subject: apiText.timelineMeetingSummarySubject.replace("{name}", meeting.name), 213 content: apiText.timelineMeetingSummaryContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy")).replace("{fullName}", session.fullName), 214 category: "MEETING_UPDATED", 215 createdById: session.employeeId, 216 documentIds: [meetingRef.id], 217 createdAt: Timestamp.now() 218 }; 219 batch.set(timelineRef, timeline); 220 return batch.commit(); 221 })); 222 } 223 shareMeetingSummary(meetingId, meeting) { 224 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 225 const batch = writeBatch(this.firestore); 226 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 227 batch.update(meetingRef, meeting); 228 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 229 const timeline = { 230 subject: apiText.timelineSummaryFeedbackSubject.replace("{name}", meeting.name), 231 content: apiText.timelineSummaryFeedbackContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy")).replace("{fullName}", session.fullName), 232 category: "MEETING_UPDATED", 233 createdById: session.employeeId, 234 documentIds: [meetingRef.id], 235 createdAt: Timestamp.now() 236 }; 237 batch.set(timelineRef, timeline); 238 const dueDate = Timestamp.fromMillis(DateTime.now().plus({ day: 5 }).toMillis()); 239 const action = { 240 associatedId: meetingId, 241 associatedLabel: meeting.name ? meeting.name : "", 242 title: apiText.acknowledgeMeetingTitle.replace("{timeNow}", DateTime.now().toFormat("dd MMM yyyy")), 243 description: apiText.acknowledgeMeetingDescription.replace("{timeNow}", DateTime.now().toFormat("dd MMM yyyy")), 244 actionType: "meet", 245 createdBy: session.fullName, 246 employeeId: meeting.employeeId, 247 recordType: null, 248 completedAt: null, 249 completedBy: null, 250 period: null, 251 surveyRunId: null, 252 relatedTo: meetingRef.id, 253 status: "open", 254 dueDate, 255 lastUpdatedAt: Timestamp.now(), 256 createdAt: Timestamp.now() 257 }; 258 const actionRef = doc(collection(this.firestore, "organizations", session.orgId, "actions")); 259 batch.set(actionRef, action); 260 return batch.commit(); 261 })); 262 } 263 onSaveToDraft(meetingId, meeting) { 264 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 265 const batch = writeBatch(this.firestore); 266 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 267 batch.update(meetingRef, meeting); 268 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 269 const timeline = { 270 subject: apiText.timelineMeetingUpdateSubject.replace("{name}", meeting.name), 271 content: apiText.timelineMeetingUpdateContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 272 category: "CYCLE_UPDATED", 273 createdById: session.employeeId, 274 documentIds: [meetingRef.id], 275 createdAt: Timestamp.now() 276 }; 277 batch.set(timelineRef, timeline); 278 return batch.commit(); 279 })); 280 } 281 onSaveToReview(meetingId, meeting, scheduledTimestamp, ownerId) { 282 let ownerName = ""; 283 return this.employeeService.getEmployeeName$(ownerId).pipe(switchMap((employeeName) => { 284 ownerName = employeeName; 285 return this.authService.getCurrentSession$(); 286 }), switchMap((session) => { 287 const batch = writeBatch(this.firestore); 288 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meetingId); 289 batch.update(meetingRef, meeting); 290 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 291 const timeline = {
292 subject: apiText.timelineMeetingReviewSubject.replace("{name}", meeting.name), 293 content: apiText.timelineMeetingReviewContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 294 category: "CYCLE_UPDATED", 295 createdById: session.employeeId, 296 documentIds: [meetingRef.id], 297 createdAt: Timestamp.now() 298 }; 299 batch.set(timelineRef, timeline); 300 if (Array.isArray(meeting.meetingQuestions) && meeting.meetingQuestions?.length > 0) { 301 const scheduledDate = DateTime.fromSeconds(scheduledTimestamp.seconds); 302 const now = DateTime.now(); 303 let dueDate = Timestamp.fromDate(scheduledDate.minus({ days: 7 }).toJSDate()); 304 if (scheduledDate.diff(now, "days").days <= 7) { 305 dueDate = Timestamp.fromDate(scheduledDate.minus({ hours: 24 }).toJSDate()); 306 } 307 const taskRef = doc(collection(this.firestore, "organizations", session.orgId, "tasks")); 308 const task = { 309 title: apiText.reviewMeetingNotesTitle.replace("{name}", meeting.name), 310 description: apiText.reviewMeetingNotesDescription.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 311 associatedId: meetingRef.id, 312 associatedLabel: `${meeting.name} meeting`, 313 associatedType: "MEETING", 314 attachments: [], 315 comments: [], 316 completedById: null, 317 ownerRead: null, 318 seenBy: null, 319 completedAt: null, 320 createdAt: Timestamp.now(), 321 documentIds: [ownerId], 322 dueDate, 323 isCompleted: false, 324 lastUpdatedAt: Timestamp.now(), 325 ownerId, 326 ownerName, 327 ownerType: "EMPLOYER" 328 }; 329 batch.set(taskRef, task); 330 } 331 return batch.commit(); 332 }), take(1)); 333 } 334 /* ============================================ 335 END CRUD 336 ============================================ */ 337 /* ============================================ 338 FETCHING 339 ============================================ */ 340 getMeetingById(meetingId) { 341 return this.authService.getCurrentSession$().pipe(take(1), switchMap(({ orgId }) => { 342 const docRef = doc(this.firestore, "organizations", orgId, "meetings", meetingId); 343 return docSnapshots(docRef); 344 }), map((doc2) => { 345 return __spreadProps(__spreadValues({}, doc2.data()), { 346 id: doc2.id, 347 exists: doc2.exists() 348 }); 349 })); 350 } 351 getMeetingsByCycleId(cycleId) { 352 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 353 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 354 const q = query(colRef, orderBy("scheduledDate", "asc"), where("cycleId", "==", cycleId), limit(5)); 355 return collectionSnapshots(q); 356 }), map((collectionSnapshots2) => collectionSnapshots2.map((collectionSnapshot) => { 357 return __spreadProps(__spreadValues({}, collectionSnapshot.data()), { 358 id: collectionSnapshot.id, 359 exists: collectionSnapshot.exists() 360 }); 361 }))); 362 } 363 getMeetingsCountByCycleId(cycleId) { 364 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 365 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 366 const q = query(colRef, orderBy("scheduledDate", "asc"), where("cycleId", "==", cycleId)); 367 return getCountFromServer(q); 368 }), map((collectionSnapshots2) => collectionSnapshots2.data().count)); 369 } 370 getMeetingsBySickLeaveId(sickLeaveId) { 371 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 372 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 373 const q = query(colRef, orderBy("scheduledDate", "asc"), where("sickLeaveId", "==", sickLeaveId), limit(5)); 374 return collectionSnapshots(q); 375 }), map((collectionSnapshots2) => collectionSnapshots2.map((collectionSnapshot) => { 376 return __spreadProps(__spreadValues({}, collectionSnapshot.data()), { 377 id: collectionSnapshot.id, 378 exists: collectionSnapshot.exists() 379 }); 380 }
380))); 381 } 382 getMeetingsCountBySickLeaveId(sickLeaveId) { 383 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 384 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 385 const q = query(colRef, orderBy("scheduledDate", "asc"), where("sickLeaveId", "==", sickLeaveId)); 386 return getCountFromServer(q); 387 }), map((collectionSnapshots2) => collectionSnapshots2.data().count)); 388 } 389 getMeetingsByEmployeeId(employeeId) { 390 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 391 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 392 const q = query(colRef, orderBy("scheduledDate", "asc"), where("employeeId", "==", employeeId), limit(5)); 393 return collectionSnapshots(q); 394 }), map((collectionSnapshots2) => collectionSnapshots2.map((collectionSnapshot) => { 395 return __spreadProps(__spreadValues({}, collectionSnapshot.data()), { 396 id: collectionSnapshot.id, 397 exists: collectionSnapshot.exists() 398 }); 399 }))); 400 } 401 getMeetingsCountByEmployeeId(employeeId) { 402 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 403 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 404 const q = query(colRef, orderBy("scheduledDate", "asc"), where("employeeId", "==", employeeId)); 405 return getCountFromServer(q); 406 }), map((collectionSnapshots2) => collectionSnapshots2.data().count)); 407 } 408 getMeetingsByOwnerId(ownerId) { 409 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 410 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 411 const q = query(colRef, orderBy("scheduledDate", "asc"), where("ownerId", "==", ownerId), limit(5)); 412 return collectionSnapshots(q); 413 }), map((collectionSnapshots2) => collectionSnapshots2.map((collectionSnapshot) => { 414 return __spreadProps(__spreadValues({}, collectionSnapshot.data()), { 415 id: collectionSnapshot.id, 416 exists: collectionSnapshot.exists() 417 }); 418 }))); 419 } 420 getMeetingsCountByOwnerId(ownerId) { 421 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 422 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 423 const q = query(colRef, orderBy("scheduledDate", "asc"), where("ownerId", "==", ownerId)); 424 return getCountFromServer(q); 425 }), map((collectionSnapshots2) => collectionSnapshots2.data().count)); 426 } 427 cancelMeeting(meeting) { 428 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 429 const batch = writeBatch(this.firestore); 430 const meetingRef = doc(this.firestore, "organizations", session.orgId, "meetings", meeting.id); 431 const body = { 432 lastUpdatedAt: Timestamp.now(), 433 status: "canceled" 434 }; 435 batch.update(meetingRef, body); 436 const timelineRef = doc(collection(this.firestore, "organizations", session.orgId, "timeline")); 437 const timeline = { 438 subject: apiText.timelineMeetingCancelSubject.replace("{name}", meeting.name), 439 content: apiText.timelineMeetingCancelContent.replace("{name}", meeting.name).replace("{timeNow}", DateTime.now().toFormat("dd/MM/yyyy HH:mm")).replace("{fullName}", session.fullName), 440 category: "CYCLE_UPDATED", 441 createdById: session.employeeId, 442 documentIds: [meetingRef.id], 443 createdAt: Timestamp.now() 444 }; 445 batch.set(timelineRef, timeline); 446 return batch.commit(); 447 })); 448 } 449 // Two disjoint queries for the personal meetings widget: 450 // - overdue: scheduledDate before today AND status still "active" (not completed/canceled), 451 // so meetings that should have happened but weren't closed out show up. 452 // - thisWeek: scheduledDate from today through the end of the ISO week. 453 // Both restrict to meetings the user owns. 454 // Date ranges don't overlap, so counts can be summed without deduping. 455 personalMeetingsQueries(orgId, employeeId) { 456 const todayStart = Timestamp.fromMillis(DateTime.now().startOf("day").toMillis()); 457 const weekEnd = Timestamp.fromMillis(DateTime.now().endOf("week").toMillis()); 458 const colRef = collection(this.firestore, "organizations", orgId, "meetings"); 459 const activeStatuses = ["scheduled", "review", "feedback", "acknowledged"]; 460 const ownership = or(where("ownerId", "==", employeeId)); 461 return query(colRef, and(where("scheduledDate", ">=", todayStart), where("scheduledDate", "<=", weekEnd), where("status", "in", activeStatuses), ownership)); 462 } 463 getPersonalMeetings() { 464 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 465 const meetingsQuery = this.personalMeetingsQueries(session.orgId, session.employeeId); 466 const thisWeekList = query(meetingsQuery, orderBy("scheduledDate", "asc"), limit(5)); 467 return getDocs(thisWeekList); 468 }), map((snapDocs) => snapDocs.docs.map((d) => __spreadProps(__spreadValues({}, d.data()), { 469 id: d.id, 470 exists: d.exists() 471 })))); 472 } 473 // Snapshot for the Conversations widget. One round-trip per signal: 474 // - nextMeeting: earliest upcoming scheduled meeting the user owns (or null). 475 // - pendingCounts: per-status counts for post-event meetings the user owns 476 // (review / feedback / acknowledged). Rendered as a 3-bar vertical chart. 477 // - lastCompletedMeetingAt: completedDate of the most recent 'completed' meeting 478 // the user owns, in millis (or null when none have ever been completed). Used by 479 // the widget's "Last meeting" footer line â a cadence signal for managers. 480 // DB-level filtering on every query â no client-side scanning. 481 getConversationsSnapshot() { 482 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 483 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 484 const now = Timestamp.fromMillis(DateTime.now().toMillis()); 485 const nextQ = query(colRef, where("ownerId", "==", session.employeeId), where("status", "==", "scheduled"), where("scheduledDate", ">=", now), orderBy("scheduledDate", "asc"), limit(1)); 486 const lastCompletedQ = query(colRef, where("ownerId", "==", session.employeeId), where("status", "==", "completed"), orderBy("completedDate", "desc"), limit(1)); 487 const countByStatus = (status) => from(getCountFromServer(query(colRef, where("ownerId", "==", session.employeeId), where("status", "==", status)))).pipe(map((snap) => snap.data().count)); 488 return combineLatest([ 489 from(getDocs(nextQ)).pipe(map((snap) => { 490 const first = snap.docs[0]; 491 if (!first) 492 return null; 493 return __spreadProps(__spreadValues({}, first.data()), { id: first.id, exists: first.exists() }); 494 })), 495 countByStatus("review"), 496 countByStatus("feedback"),
497 countByStatus("acknowledged"), 498 from(getDocs(lastCompletedQ)).pipe(map((snap) => { 499 const first = snap.docs[0]; 500 if (!first) 501 return null; 502 const data = first.data(); 503 return data.completedDate?.toMillis() ?? data.scheduledDate?.toMillis() ?? null; 504 })) 505 ]).pipe(map(([nextMeeting, review, feedback, acknowledged, lastCompletedMeetingAt]) => ({ 506 nextMeeting, 507 pendingCounts: { review, feedback, acknowledged }, 508 lastCompletedMeetingAt 509 }))); 510 })); 511 } 512 getCountForPersonalMeetings() { 513 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 514 const thisWeekQuery = this.personalMeetingsQueries(session.orgId, session.employeeId); 515 return getCountFromServer(thisWeekQuery); 516 }), map((thisWeekSnap) => thisWeekSnap.data().count)); 517 } 518 /* ============================================ 519 END FETCHING 520 ============================================ */ 521 /* ============================================ 522 EMPLOYEE MEETINGS 523 ============================================ */ 524 getMeetingCountByEmployeeId(employeeId, status, manager, startDate, endDate) { 525 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 526 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 527 let q = query(colRef, where("employeeId", "==", employeeId)); 528 if (status && status !== "all") { 529 q = query(q, where("status", "==", status)); 530 } 531 if (manager) { 532 q = query(q, where("ownerId", "==", manager)); 533 } 534 if (startDate && endDate) { 535 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 536 } 537 return getCountFromServer(q); 538 }), map((snapshot) => snapshot.data().count)); 539 } 540 getMeetingsByEmployeeIdFirstPage(employeeId, perPage, orderByField, sortDirection, status, manager, startDate, endDate) { 541 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 542 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 543 let q = query(colRef, where("employeeId", "==", employeeId), orderBy(orderByField, sortDirection), limit(perPage)); 544 if (status && status !== "all") { 545 q = query(q, where("status", "==", status)); 546 } 547 if (manager) { 548 q = query(q, where("ownerId", "==", manager)); 549 } 550 if (startDate && endDate) { 551 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 552 } 553 return getDocs(q); 554 }), map((snapshot) => { 555 const result = snapshot.docs.map((doc2) => { 556 return __spreadProps(__spreadValues({}, doc2.data()), { 557 id: doc2.id, 558 exists: doc2.exists() 559 }); 560 }); 561 return { 562 result, 563 lastVisible: snapshot.docs[snapshot.docs.length - 1], 564 firstVisible: snapshot.docs[0] 565 }; 566 })); 567 } 568 getMeetingsByEmployeeIdNextPage(employeeId, fieldValue, perPage, orderByField = "startDateFormat", sortDirection = "desc", status, manager, startDate, endDate) { 569 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 570 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 571 let q = query(colRef, where("employeeId", "==", employeeId), orderBy(orderByField, sortDirection), startAfter(fieldValue), limit(perPage)); 572 if (status && status !== "all") { 573 q = query(q, where("status", "==", status)); 574 } 575 if (manager) { 576 q = query(q, where("ownerId", "==", manager)); 577 } 578 if (startDate && endDate) { 579 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 580 } 581 return getDocs(q); 582 }), map((snapshot) => { 583 const result = snapshot.docs.map((doc2) => { 584 return __spreadProps(__spreadValues({}, doc2.data()), { 585 id: doc2.id, 586 exists: doc2.exists() 587 }); 588 }); 589 return { 590 result, 591 lastVisible: snapshot.docs[snapshot.docs.length - 1], 592 firstVisible: snapshot.docs[0] 593 }; 594 })); 595 } 596 getMeetingsByEmployeeIdPrevPage(employeeId, fieldValue, perPage, orderByField = "startDateFormat", sortDirection = "desc", status, manager, startDate, endDate) { 597 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 598 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 599 let q = query(colRef, where("employeeId", "==", employeeId), orderBy(orderByField, sortDirection), endBefore(fieldValue), limitToLast(perPage)); 600 if (status && status !== "all") { 601 q = query(q, where("status", "==", status)); 602 } 603 if (manager) { 604 q = query(q, where("ownerId", "==", manager)); 605 } 606 if (startDate && endDate) { 607 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 608 } 609 return getDocs(q); 610 }), map((snapshot) => { 611 const result = snapshot.docs.map((doc2) => { 612 return __spreadProps(__spreadValues({}, doc2.data()), { 613 id: doc2.id, 614 exists: doc2.exists() 615 }); 616 }); 617 return { 618 result, 619 lastVisible: snapshot.docs[snapshot.docs.length - 1], 620 firstVisible: snapshot.docs[0] 621 }; 622 })); 623 } 624 getStaticQuestionsByType(type) { 625 const colRef = collection(this.firestore, "cycleQuestions"); 626 const language = environment.language; 627 const q = query(colRef, where("types", "array-contains", type), where("language", "==", language)); 628 return from(getDocs(q)).pipe(map((colSnaps) => colSnaps.docs.map((colDoc) => __spreadValues({}, colDoc.data())))); 629 } 630 /* ============================================ 631 END EMPLOYEE MEETINGS 632 ============================================ */ 633 /* ============================================ 634 CYCLE MEETINGS 635 ============================================ */ 636 getMeetingCountByCycleId(cycleId, status, manager, startDate, endDate) { 637 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 638 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 639 let q = query(colRef, where("cycleId", "==", cycleId)); 640 if (status && status !== "all") { 641 q = query(q, where("status", "==", status)); 642 } 643 if (manager) { 644 q = query(q, where("ownerId", "==", manager)); 645 } 646 if (startDate && endDate) { 647 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 648 } 649 return getCountFromServer(q); 650 }), map((snapshot) => snapshot.data().count)); 651 } 652 getMeetingsByCycleIdFirstPage(cycleId, perPage, orderByField, sortDirection, status, manager, startDate, endDate) { 653 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 654 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 655 let q = query(colRef, where("cycleId", "==", cycleId), orderBy(orderByField, sortDirection), limit(perPage)); 656 if (status && status !== "all") { 657 q = query(q, where("status", "==", status)); 658 } 659 if (manager) { 660 q = query(q, where("ownerId", "==", manager)); 661 } 662 if (startDate && endDate) { 663 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 664 } 665 return getDocs(q); 666 }), map((snapshot) => { 667 const result = snapshot.docs.map((doc2) => { 668 return __spreadProps(__spreadValues({}, doc2.data()), { 669 id: doc2.id, 670 exists: doc2.exists() 671 }); 672 }); 673 return { 674 result, 675 lastVisible: snapshot.docs[snapshot.docs.length - 1], 676 firstVisible: snapshot.docs[0] 677 }; 678 })); 679 } 680 getMeetingsByCycleIdNextPage(cycleId, fieldValue, perPage, orderByField = "startDateFormat", sortDirection = "desc", status, manager, startDate, endDate) { 681 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 682 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 683 let q = query(colRef, where("cycleId", "==", cycleId), orderBy(orderByField, sortDirection), startAfter(fieldValue), limit(perPage)); 684 if (status && status !== "all") { 685 q = query(q, where("status", "==", status)); 686 } 687 if (manager) { 688 q = query(q, where("ownerId", "==", manager)); 689 } 690 if (startDate && endDate) { 691 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 692 } 693 return getDocs(q); 694 }), map((snapshot) => { 695 const result = snapshot.docs.map((doc2) => { 696 return __spreadProps(__spreadValues({}, doc2.data()), { 697 id: doc2.id, 698 exists: doc2.exists() 699 }); 700 }); 701 return { 702 result, 703 lastVisible: snapshot.docs[snapshot.docs.length - 1], 704 firstVisible: snapshot.docs[0] 705 }; 706 })); 707 } 708 getMeetingsByCycleIdPrevPage(cycleId, fieldValue, perPage, orderByField = "startDateFormat", sortDirection = "desc", status, manager, startDate, endDate) { 709 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 710 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 711 let q = query(colRef, where("cycleId", "==", cycleId), orderBy(orderByField, sortDirection), endBefore(fieldValue), limitToLast(perPage)); 712 if (status && status !== "all") { 713 q = query(q, where("status", "==", status)); 714 } 715 if (manager) { 716 q = query(q, where("ownerId", "==", manager)); 717 } 718 if (startDate && endDate) { 719 q = query(q, where("scheduledDate", ">=", startDate), where("scheduledDate", "<=", endDate)); 720 } 721 return getDocs(q); 722 }), map((snapshot) => { 723 const result = snapshot.docs.map((doc2) => { 724 return __spreadProps(__spreadValues({}, doc2.data()), { 725 id: doc2.id, 726 exists: doc2.exists() 727 }); 728 }); 729 return { 730 result, 731 lastVisible: snapshot.docs[snapshot.docs.length - 1], 732 firstVisible: snapshot.docs[0] 733 }; 734 })); 735 } 736 /* ============================================ 737 END CYCLE MEETINGS 738 ============================================ */ 739 // ** ===================== ** // 740 // Meeting Pagination 741 // ** ===================== ** // 742 getMyMeetingsCount(status) { 743 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 744 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 745 const constraints = [ 746 where("ownerId", "==", session.employeeId) 747 ]; 748 if (status && status !== "all") { 749 constraints.push(where("status", "==", status)); 750 } 751 const q = query(colRef, ...constraints); 752 return from(getCountFromServer(q)).pipe(map((snap) => snap.data().count)); 753 })); 754 } 755 getMyMeetingsFirstPage(perPage, orderByField = "scheduledDate", sortDirection = "desc", status) { 756 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 757 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 758 const baseConstraints = [ 759 where("ownerId", "==", session.employeeId), 760 orderBy(orderByField, sortDirection), 761 limit(perPage) 762 ]; 763 if (status && status !== "all") { 764 baseConstraints.push(where("status", "==", status)); 765 } 766 const q = query(colRef, ...baseConstraints); 767 return from(getDocs(q)).pipe(map((snapshot) => [snapshot])); 768 }), map((snapshots) => { 769 const docs = snapshots.flatMap((s) => s.docs); 770 const result = docs.map((doc2) => __spreadProps(__spreadValues({}, doc2.data()), { 771 id: doc2.id, 772 exists: doc2.exists() 773 })); 774 return { 775 result, 776 firstVisible: docs[0], 777 lastVisible: docs[docs.length - 1] 778 }; 779 })); 780 } 781 getMyMeetingsNextPage(fieldValue, perPage, orderByField = "scheduledDate", sortDirection = "desc", status) { 782 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 783 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 784 const baseConstraints = [ 785 where("ownerId", "==", session.employeeId), 786 orderBy(orderByField, sortDirection), 787 startAfter(fieldValue), 788 limit(perPage) 789 ]; 790 if (status && status !== "all") { 791 baseConstraints.push(where("status", "==", status)); 792 } 793 const q = query(colRef, ...baseConstraints); 794 return from(getDocs(q)).pipe(map((snapshot) => [snapshot])); 795 }), map((snapshots) => { 796 const docs = snapshots.flatMap((s) => s.docs); 797 const result = docs.map((doc2) => __spreadProps(__spreadValues({}, doc2.data()), { 798 id: doc2.id, 799 exists: doc2.exists() 800 })); 801 return { 802 result, 803 firstVisible: docs[0], 804 lastVisible: docs[docs.length - 1] 805 }; 806 })); 807 } 808 getMyMeetingsPrevPage(fieldValue, perPage, orderByField = "scheduledDate", sortDirection = "desc", status) { 809 return this.authService.getCurrentSession$().pipe(take(1), switchMap((session) => { 810 const colRef = collection(this.firestore, "organizations", session.orgId, "meetings"); 811 const baseConstraints = [ 812 where("ownerId", "==", session.employeeId), 813 orderBy(orderByField, sortDirection), 814 endBefore(fieldValue), 815 limitToLast(perPage) 816 ]; 817 if (status && status !== "all") { 818 baseConstraints.push(where("status", "==", status)); 819 } 820 const q = query(colRef, ...baseConstraints); 821 return from(getDocs(q)).pipe(map((snapshot) => [snapshot])); 822 }), map((snapshots) => { 823 const docs = snapshots.flatMap((s) => s.docs); 824 const result = docs.map((doc2) => __spreadProps(__spreadValues({}, doc2.data()), { 825 id: doc2.id, 826 exists: doc2.exists() 827 })); 828 return { 829 result, 830 firstVisible: docs[0], 831 lastVisible: docs[docs.length - 1] 832 }; 833 })); 834 } 835 static { 836 this.\u0275fac = function MeetingService_Factory(__ngFactoryType__) { 837 return new (__ngFactoryType__ || _MeetingService)(\u0275\u0275inject(Firestore), \u0275\u0275inject(EmployeeService), \u0275\u0275inject(AuthenticationService)); 838 }; 839 } 840 static { 841 this.\u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ token: _MeetingService, factory: _MeetingService.\u0275fac, providedIn: "root" }); 842 } 843}; 844(() => { 845 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MeetingService, [{ 846 type: Injectable, 847 args: [{ 848 providedIn: "root" 849 }] 850 }], () => [{ type: Firestore }, { type: EmployeeService }, { type: AuthenticationService }], null); 851})(); 852 853export { 854 MeetingService 855}; 856/**i18n:55a58011b6fcf12b70aba021cbe233ce2fe179902ce3502a5c6547ccaba0ed7f*/ 857//# sourceMappingURL=chunk-BMLNIFAP.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.