PageSourceSearch

https://office.workvine.nl/chunk-BMLNIFAP.js

js workvine.nl collected 2026-10-09 01:41:03 UTC 39,777 bytes, 857 lines download raw bytes

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.