@bash-app/bash-common 30.276.0 → 30.277.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,44 @@ import { RecurringFrequency } from "@prisma/client";
2
2
  import { DateTime } from "luxon";
3
3
  import { dateTimeFromDate, dateTimeSetTime, dayOfWeekGetIdx, LUXON_DATETIME_FORMAT_ISO_LIKE, } from "./luxonUtils.js";
4
4
  import { compareDateTime } from "./dateTimeUtils.js";
5
+ /**
6
+ * Stable key for an occurrence within a series. Both the generator and the
7
+ * skip/move persistence must derive the key the same way, so callers should use this.
8
+ */
9
+ export function occurrenceOverrideKey(occurrenceStart) {
10
+ const dt = DateTime.isDateTime(occurrenceStart)
11
+ ? occurrenceStart
12
+ : dateTimeFromDate(occurrenceStart);
13
+ return dt.toFormat(LUXON_DATETIME_FORMAT_ISO_LIKE);
14
+ }
15
+ /** Safely coerce the `Recurrence.occurrenceOverrides` Json column into a typed map. */
16
+ export function parseOccurrenceOverrides(raw) {
17
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
18
+ return {};
19
+ const out = {};
20
+ for (const [key, value] of Object.entries(raw)) {
21
+ if (value &&
22
+ typeof value === "object" &&
23
+ typeof value.startDateTime === "string") {
24
+ const v = value;
25
+ out[key] = {
26
+ startDateTime: v.startDateTime,
27
+ endDateTime: typeof v.endDateTime === "string" ? v.endDateTime : null,
28
+ };
29
+ }
30
+ }
31
+ return out;
32
+ }
33
+ /** True when the host has skipped or moved at least one occurrence in the series. */
34
+ export function recurrenceHasOccurrenceExceptions(recurrence) {
35
+ if (!recurrence)
36
+ return false;
37
+ const excluded = recurrence.excludedDates ?? [];
38
+ if (excluded.length > 0)
39
+ return true;
40
+ const overrides = parseOccurrenceOverrides(recurrence.occurrenceOverrides);
41
+ return Object.keys(overrides).length > 0;
42
+ }
5
43
  export function getRecurringBashEventPossibleDateTimes(startDateTime, recurrence) {
6
44
  return getRecurringBashEventPossibleDatesTimesInternal(startDateTime, recurrence, true);
7
45
  }
@@ -42,6 +80,10 @@ function getRecurringBashEventPossibleDatesTimesInternal(startDateTime, recurren
42
80
  if (recurrence.repeatCount && recurrence.repeatCount > 0) {
43
81
  recurrenceDates = recurrenceDates.slice(0, recurrence.repeatCount);
44
82
  }
83
+ // Apply per-occurrence exceptions against the original generated instants:
84
+ // 1) drop occurrences the host removed (excludedDates)
85
+ // 2) move occurrences the host rescheduled (occurrenceOverrides)
86
+ recurrenceDates = applyOccurrenceExceptions(recurrenceDates, recurrence);
45
87
  return recurrenceDates
46
88
  .map((date) => date.toFormat(LUXON_DATETIME_FORMAT_ISO_LIKE))
47
89
  .sort()
@@ -55,6 +97,34 @@ function getRecurringBashEventPossibleDatesTimesInternal(startDateTime, recurren
55
97
  }
56
98
  });
57
99
  }
100
+ /**
101
+ * Remove skipped occurrences and apply rescheduled (moved) occurrences. Matching is by
102
+ * the original occurrence's `LUXON_DATETIME_FORMAT_ISO_LIKE` key so it survives the
103
+ * format→reparse round-trip the generator already does.
104
+ */
105
+ function applyOccurrenceExceptions(occurrences, recurrence) {
106
+ const excludedKeys = new Set(((recurrence.excludedDates) ?? []).map((d) => occurrenceOverrideKey(d)));
107
+ const overrides = parseOccurrenceOverrides(recurrence.occurrenceOverrides);
108
+ if (excludedKeys.size === 0 && Object.keys(overrides).length === 0) {
109
+ return occurrences;
110
+ }
111
+ const result = [];
112
+ for (const occ of occurrences) {
113
+ const key = occurrenceOverrideKey(occ);
114
+ if (excludedKeys.has(key))
115
+ continue;
116
+ const override = overrides[key];
117
+ if (override?.startDateTime) {
118
+ const moved = dateTimeFromDate(new Date(override.startDateTime));
119
+ if (moved.isValid) {
120
+ result.push(moved);
121
+ continue;
122
+ }
123
+ }
124
+ result.push(occ);
125
+ }
126
+ return result;
127
+ }
58
128
  /**
59
129
  * Get the daily recurring dates
60
130
  * @param beginningDateTime The beginning DateTime of the event, adjusted to be no earlier than now.
@@ -1 +1 @@
1
- {"version":3,"file":"recurrenceUtils.js","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAEjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,8BAA8B,GAC/B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,UAAU,sCAAsC,CACpD,aAA8B,EAC9B,UAAyC;IAEzC,OAAO,+CAA+C,CACpD,aAAa,EACb,UAAU,EACV,IAAI,CACK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,aAA8B,EAC9B,UAAyC;IAEzC,OAAO,+CAA+C,CACpD,aAAa,EACb,UAAU,EACV,KAAK,CACQ,CAAC;AAClB,CAAC;AAED,SAAS,+CAA+C,CACtD,aAA8B,EAC9B,UAAyC,EACzC,MAAe;IAEf,IACE,CAAC,UAAU;QACX,CAAC,UAAU,CAAC,SAAS;QACrB,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EACjD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,eAAe,GAAe,EAAE,CAAC;IAErC,0EAA0E;IAC1E,kEAAkE;IAClE,MAAM,kBAAkB,GACtB,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,OAAO;QACnD,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,CAAC;IAErD,MAAM,aAAa,GAAG,kBAAkB;QACtC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClF,CAAC,CAAC,iCAAiC,CAAC,aAAa,CAAa,CAAC;IAEjE,QAAQ,UAAU,CAAC,SAAS,EAAE,CAAC;QAC7B,KAAK,kBAAkB,CAAC,KAAK;YAC3B,eAAe,GAAG,sBAAsB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACpE,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,eAAe,GAAG,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM;QACR,KAAK,kBAAkB,CAAC,OAAO;YAC7B,eAAe,GAAG,wBAAwB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACtE,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,eAAe,GAAG,uBAAuB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,0BAA0B,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,8DAA8D;IAC9D,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QACzD,eAAe,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,eAAe;SACnB,GAAG,CAAC,CAAC,IAAc,EAAU,EAAE,CAC9B,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAC9C;SACA,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,OAAe,EAAmB,EAAE;QACxC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CACnC,OAAO,EACP,8BAA8B,CAC/B,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAE1C,sDAAsD;IACtD,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,CAAC;IAE/D,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,iBAAiB,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9E,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,8EAA8E;IAE5I,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,wBAAwB,GAAG,iBAAiB,CAAC;IAEjD,mDAAmD;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,OAAO,GAAoB,IAAI,CAAC;QACpC,KAAK,MAAM,aAAa,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;YACpD,OAAO,GAAG,wBAAwB,CAAC,GAAG,CAAC;gBACrC,OAAO,EAAE,YAA8B;aACxC,CAAC,CAAC;YACH,IAAI,OAAO,GAAG,cAAc,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;gBAC5D,SAAS,CAAC,oEAAoE;YAChF,CAAC;YACD,6EAA6E;YAC7E,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YACtD,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,wBAAwB,GAAG,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,0BAA0B,CACjC,IAAc,EACd,QAAgB;IAEhB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU;IAC1B,CAAC;IACD,qGAAqG;IACrG,MAAM,iBAAiB,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAS,wBAAwB,CAC/B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,GAAG,CAAC;IAE1E,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAE5G,6EAA6E;IAC7E,IAAI,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACpC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,WAAW,IAAI,cAAc,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QACzD,UAAU,EAAE,CAAC;QAEb,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,2CAA2C;YAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrD,4DAA4D;QAC5D,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,uBAAuB,CAC9B,iBAA2B,EAC3B,UAAsB;IAEtB,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI;QACpC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtD,yEAAyE;IACzE,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB;QAC1C,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAC/C,CAAC,CAAC,iBAAiB,CAAC;IAEtB,MAAM,eAAe,GAAe,EAAE,CAAC;IACvC,IAAI,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,IAAI,EAAE,iBAAiB,CAAC,IAAI;QAC5B,MAAM,EAAE,iBAAiB,CAAC,MAAM;QAChC,MAAM,EAAE,iBAAiB,CAAC,MAAM;KACjC,CAAC,CAAC;IAEH,oEAAoE;IACpE,IAAI,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACpC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,WAAW,IAAI,cAAc,EAAE,CAAC;QACrC,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;YACrC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mCAAmC,CACjD,aAA8B,EAC9B,WAA+C,EAC/C,UAAyC,EACzC,aAA6B;IAE7B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;IAC1B,4FAA4F;IAC5F,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAC/B,aAAa,YAAY,IAAI;QAC3B,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,IAAI,IAAI,CAAC,aAAuB,CAAC,CACtC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAC7B,WAAW,YAAY,IAAI;QACzB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,IAAI,CAAC,WAAqB,CAAC,CACpC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,uCAAuC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;IAC/E,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAwB,EACxB,QAA4B,EAC5B,cAAuB,KAAK;IAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC9B,IAAI,MAAM,GAAW,IAAI,CAAC;IAC1B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,kBAAkB,CAAC,KAAK;YAC3B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACnC,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM;QACR,KAAK,kBAAkB,CAAC,OAAO;YAC7B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YACvC,MAAM;QACR,KAAK,kBAAkB,CAAC,MAAM;YAC5B,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;YACrC,MAAM;IACV,CAAC;IACD,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,gBAAiC;IAEjC,OAAO,yCAAyC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,yCAAyC,CAChD,gBAAiC,EACjC,SAAkB;IAElB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IACD,4CAA4C;IAC5C,MAAM,aAAa,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,eAAe,CACtC,eAAe,CAAC,QAAQ,EAAE,EAC1B,gBAAgB,CACjB,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"recurrenceUtils.js","sourceRoot":"","sources":["../../src/utils/recurrenceUtils.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ export type ServiceBookingFeeBase = Omit<ServiceBookingFeeExt, "id" | "serviceBo
7
7
  export type ServiceBookingPriceBreakdownBase = Omit<ServiceBookingPriceBreakdownExt, "id" | "serviceBookingDayId" | "serviceBookingDay">;
8
8
  export type ServiceBookingDayBase = Omit<ServiceBookingDayExt, "id" | "serviceBookingRequestId" | "serviceBookingRequest">;
9
9
  export type ServiceBookingBase = Pick<ServiceBookingExt, "bookedDays" | "timezone" | "additionalFees">;
10
- export type ServiceBookingRequiredData = MakeNullablePropsOptional<MakeOptional<ServiceBookingExt, "id" | "isVendorBid" | "bashEventId" | "vendorEventDetails" | "serviceId" | "service" | "forUserId" | "forUser" | "creatorId" | "creator" | "checkout" | "settlementStatus" | "settlementAttempts">>;
10
+ export type ServiceBookingRequiredData = MakeNullablePropsOptional<MakeOptional<ServiceBookingExt, "id" | "isVendorBid" | "bashEventId" | "vendorEventDetails" | "serviceId" | "service" | "forUserId" | "forUser" | "creatorId" | "creator" | "checkout" | "settlementStatus" | "settlementAttempts" | "rescheduleStatus">>;
11
11
  export type ServiceBookingAddonBaseT = ServiceBookingAddOnBase;
12
12
  export type ServiceBookingPackageBaseT = ServiceBookingPackageBase;
13
13
  export type ServiceBookingFeeBaseT = ServiceBookingFeeBase;
@@ -1 +1 @@
1
- {"version":3,"file":"serviceBookingTypes.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceBookingTypes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,EAC/B,oBAAoB,EAGpB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,sBAAsB,EACpB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,sBAAsB,EACpB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,EAClB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG,IAAI,CACjD,+BAA+B,EAC/B,IAAI,GAAG,qBAAqB,GAAG,mBAAmB,CACnD,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,EACpB,IAAI,GAAG,yBAAyB,GAAG,uBAAuB,CAC3D,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,iBAAiB,EACjB,YAAY,GAAG,UAAU,GAAG,gBAAgB,CAC7C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,CAChE,YAAY,CACV,iBAAiB,EACf,IAAI,GACJ,aAAa,GACb,aAAa,GACb,oBAAoB,GACpB,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,GACT,UAAU,GAGV,kBAAkB,GAClB,oBAAoB,CACvB,CACF,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AAC/D,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,CAAC;AACnE,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAC3D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,gCAAgC,EAChC,WAAW,GAAG,SAAS,CACxB,GAAG;IACF,aAAa,EAAE,cAAc,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,qBAAqB,EACrB,WAAW,GAAG,SAAS,CACxB,GAAG;IACF,aAAa,EAAE,cAAc,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"serviceBookingTypes.d.ts","sourceRoot":"","sources":["../../../src/utils/service/serviceBookingTypes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,+BAA+B,EAC/B,oBAAoB,EAGpB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,sBAAsB,EACpB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,sBAAsB,EACpB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,EAClB,IAAI,GACJ,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,CACnB,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG,IAAI,CACjD,+BAA+B,EAC/B,IAAI,GAAG,qBAAqB,GAAG,mBAAmB,CACnD,CAAC;AACF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,EACpB,IAAI,GAAG,yBAAyB,GAAG,uBAAuB,CAC3D,CAAC;AACF,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,iBAAiB,EACjB,YAAY,GAAG,UAAU,GAAG,gBAAgB,CAC7C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,CAChE,YAAY,CACV,iBAAiB,EACf,IAAI,GACJ,aAAa,GACb,aAAa,GACb,oBAAoB,GACpB,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,GACT,WAAW,GACX,SAAS,GACT,UAAU,GAGV,kBAAkB,GAClB,oBAAoB,GAGpB,kBAAkB,CACrB,CACF,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AAC/D,MAAM,MAAM,0BAA0B,GAAG,yBAAyB,CAAC;AACnE,MAAM,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAC3D,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,gCAAgC,EAChC,WAAW,GAAG,SAAS,CACxB,GAAG;IACF,aAAa,EAAE,cAAc,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,qBAAqB,EACrB,WAAW,GAAG,SAAS,CACxB,GAAG;IACF,aAAa,EAAE,cAAc,CAAC;CAC/B,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bash-app/bash-common",
3
- "version": "30.276.0",
3
+ "version": "30.277.0",
4
4
  "description": "Common data and scripts to use on the frontend and backend",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -704,6 +704,8 @@ model BashEvent {
704
704
  country String?
705
705
  /// When true, street/place/full location and map pin are hidden until public reveal or gated audience.
706
706
  hideLocation Boolean @default(false)
707
+ /// When false, the map is hidden on the bash detail page (address link may still show).
708
+ showMap Boolean @default(true)
707
709
  /// Freeform area hint shown to everyone when hideLocation (e.g. "Lower East Side").
708
710
  publicAreaHint String?
709
711
  locationRevealAudience LocationRevealAudience @default(TicketHolders)
@@ -733,7 +735,7 @@ model BashEvent {
733
735
  allowDonations Boolean? @default(false)
734
736
  suggestedDonationAmount Int?
735
737
  donationDetails String?
736
- absorbDonationFees Boolean @default(false)
738
+ absorbDonationFees Boolean @default(true)
737
739
  absorbTicketFees Boolean @default(false)
738
740
  /// Phase 1 of unified-pricing roadmap: governs where PER_BASHPOINTS_ATTENDEE
739
741
  /// settlements are paid from. `HostWallet` (default) pays directly from the
@@ -2339,6 +2341,11 @@ model Recurrence {
2339
2341
  repeatOnDays DayOfWeek[]
2340
2342
  repeatOnDayOfMonth Int?
2341
2343
  repeatYearlyDate DateTime?
2344
+ // Per-occurrence exceptions for the computed series (no occurrence rows are materialized):
2345
+ // dates the host removed from the series (matched against the generated occurrence start instants).
2346
+ excludedDates DateTime[]
2347
+ // Per-occurrence date/time moves: JSON map of original-occurrence ISO start -> { startDateTime, endDateTime? }.
2348
+ occurrenceOverrides Json?
2342
2349
  createdAt DateTime @default(now())
2343
2350
  updatedAt DateTime @updatedAt
2344
2351
  bashEvent BashEvent @relation(fields: [bashEventId], references: [id], onDelete: Cascade)
@@ -2670,6 +2677,8 @@ model User {
2670
2677
  /// Preferred processor for dual-rail onboarding (optional; legacy Stripe fields remain source of truth until fully migrated).
2671
2678
  paymentProvider PaymentProvider @default(STRIPE)
2672
2679
  isSuperUser Boolean @default(false)
2680
+ /// Enterprise: super-users may set event feeHandling to GuestPays/Split for this host.
2681
+ allowGuestFeePassThrough Boolean @default(false)
2673
2682
  isSuspended Boolean @default(false)
2674
2683
  intent UserIntent?
2675
2684
  signupSource String? // e.g. 'jamwith', 'mixlog', 'organic' for attribution
@@ -3155,6 +3164,8 @@ model UserPreferences {
3155
3164
  autoDetectLocation Boolean @default(false)
3156
3165
  recentSearches String[] @default([])
3157
3166
  expandedSections String[] @default([])
3167
+ /// Homepage event category rows pinned to the top of Upcoming Events (bashType keys)
3168
+ pinnedHomepageSections String[] @default([])
3158
3169
  preferredCurrency String @default("USD")
3159
3170
  savePaymentInfo Boolean @default(false)
3160
3171
  showEventPrices Boolean @default(true)
@@ -5021,6 +5032,14 @@ model ServiceBooking {
5021
5032
  settlementDisputedAt DateTime?
5022
5033
  // When the delta refund actually lands at the issuing bank.
5023
5034
  refundedOn DateTime?
5035
+ // Host-initiated reschedule: when the bash date/time changes we sync the booked
5036
+ // days to the new date (assume-accept) and ask the provider to confirm or reject.
5037
+ // Reject cancels the booking with a full host refund; silence keeps the new date.
5038
+ rescheduleStatus ServiceBookingRescheduleStatus @default(None)
5039
+ rescheduleRequestedOn DateTime?
5040
+ rescheduleDecisionOn DateTime?
5041
+ reschedulePrevStartDate DateTime?
5042
+ reschedulePrevEndDate DateTime?
5024
5043
  notification Notification[]
5025
5044
  bashEvent BashEvent? @relation(fields: [bashEventId], references: [id])
5026
5045
  creator User @relation("BookingCreator", fields: [creatorId], references: [id])
@@ -7551,6 +7570,14 @@ enum ServiceBookingStatus {
7551
7570
  Canceled
7552
7571
  }
7553
7572
 
7573
+ // Provider's response to a host-initiated bash date change.
7574
+ enum ServiceBookingRescheduleStatus {
7575
+ None
7576
+ Pending
7577
+ Accepted
7578
+ Rejected
7579
+ }
7580
+
7554
7581
  enum ServiceBookingType {
7555
7582
  Request
7556
7583
  Instant
@@ -1077,6 +1077,8 @@ export interface StripeConfirmPaymentResult {
1077
1077
  numberOfTickets: number;
1078
1078
  /** Sum of tier prices × qty (cents), for client-side BashPoints purchase-reward estimate */
1079
1079
  ticketsSubtotalCents?: number;
1080
+ /** Actual amount charged to the guest (cents), including pass-through fees when applicable */
1081
+ totalPaidCents?: number;
1080
1082
  }
1081
1083
 
1082
1084
  export interface IMediaUploadArgs {
@@ -424,6 +424,11 @@ export interface BashEventExt extends Omit<
424
424
  * Optional because not every endpoint that returns BashEventExt resolves the host org.
425
425
  */
426
426
  isVerifiedNonprofitHost?: boolean;
427
+ /**
428
+ * Computed at request time: true when guests pay exactly the listed ticket price
429
+ * (host absorbs processing, no external checkout). Drives "No fees for attendees" badge.
430
+ */
431
+ guestCheckoutHasNoAddedFees?: boolean;
427
432
  }
428
433
 
429
434
  /**
@@ -20,6 +20,11 @@ import {
20
20
  calculateBashPlatformFeeCents,
21
21
  splitBashPlatformFeeForTicketCheckout,
22
22
  computeTicketApplicationFeeAmountCents,
23
+ computeGuestTicketCheckoutBreakdown,
24
+ guestAllInUnitPriceCents,
25
+ guestCheckoutHasNoAddedFees,
26
+ lowestGuestAllInPriceCents,
27
+ hostAbsorbsTicketProcessing,
23
28
  userHasActiveBashPass,
24
29
  getEffectiveBashPassTier,
25
30
  getBashPassMonthlyCapRemaining,
@@ -166,7 +171,7 @@ describe("PaymentUtils - Core Functions", () => {
166
171
  expect(explicitFalse).toEqual(defaulted);
167
172
  });
168
173
 
169
- test("computeTicketApplicationFeeAmountCents — verified nonprofit host: zero Bash platform, Stripe untouched", () => {
174
+ test("computeTicketApplicationFeeAmountCents — verified nonprofit host: zero Bash platform, guest may pay processing when GuestPays", () => {
170
175
  const r = computeTicketApplicationFeeAmountCents({
171
176
  discountedSubtotalCents: 10000,
172
177
  platformFeeEnabled: true,
@@ -177,12 +182,19 @@ describe("PaymentUtils - Core Functions", () => {
177
182
  });
178
183
  expect(r.bashPlatformTotalCents).toBe(0);
179
184
  expect(r.guestPlatformLineCents).toBe(0);
180
- expect(r.totalChargedCents).toBe(10000);
181
- expect(r.stripeProcessingCents).toBe(calculateStripeProcessingFeeCents(10000));
185
+ expect(r.guestProcessingLineCents).toBe(
186
+ calculateStripeProcessingFeeCents(10000),
187
+ );
188
+ expect(r.totalChargedCents).toBe(
189
+ 10000 + calculateStripeProcessingFeeCents(10000),
190
+ );
191
+ expect(r.stripeProcessingCents).toBe(
192
+ calculateStripeProcessingFeeCents(r.totalChargedCents),
193
+ );
182
194
  expect(r.applicationFeeAmountCents).toBe(r.stripeProcessingCents);
183
195
  });
184
196
 
185
- test("computeTicketApplicationFeeAmountCents — verified nonprofit waiver overrides feeHandling=GuestPays", () => {
197
+ test("computeTicketApplicationFeeAmountCents — verified nonprofit waiver overrides platform on GuestPays", () => {
186
198
  const nonNonprofit = computeTicketApplicationFeeAmountCents({
187
199
  discountedSubtotalCents: 5000,
188
200
  platformFeeEnabled: true,
@@ -192,7 +204,12 @@ describe("PaymentUtils - Core Functions", () => {
192
204
  });
193
205
  expect(nonNonprofit.bashPlatformTotalCents).toBe(250);
194
206
  expect(nonNonprofit.guestPlatformLineCents).toBe(250);
195
- expect(nonNonprofit.totalChargedCents).toBe(5250);
207
+ expect(nonNonprofit.guestProcessingLineCents).toBe(
208
+ calculateStripeProcessingFeeCents(5000),
209
+ );
210
+ expect(nonNonprofit.totalChargedCents).toBe(
211
+ 5000 + 250 + calculateStripeProcessingFeeCents(5000),
212
+ );
196
213
 
197
214
  const nonprofit = computeTicketApplicationFeeAmountCents({
198
215
  discountedSubtotalCents: 5000,
@@ -204,8 +221,15 @@ describe("PaymentUtils - Core Functions", () => {
204
221
  });
205
222
  expect(nonprofit.bashPlatformTotalCents).toBe(0);
206
223
  expect(nonprofit.guestPlatformLineCents).toBe(0);
207
- expect(nonprofit.totalChargedCents).toBe(5000);
208
- expect(nonprofit.applicationFeeAmountCents).toBe(nonprofit.stripeProcessingCents);
224
+ expect(nonprofit.guestProcessingLineCents).toBe(
225
+ calculateStripeProcessingFeeCents(5000),
226
+ );
227
+ expect(nonprofit.totalChargedCents).toBe(
228
+ 5000 + calculateStripeProcessingFeeCents(5000),
229
+ );
230
+ expect(nonprofit.applicationFeeAmountCents).toBe(
231
+ nonprofit.stripeProcessingCents,
232
+ );
209
233
  });
210
234
 
211
235
  test("computeTicketApplicationFeeAmountCents — verified nonprofit waiver beats any membership-tier math", () => {
@@ -225,7 +249,17 @@ describe("PaymentUtils - Core Functions", () => {
225
249
  });
226
250
  expect(r.bashPlatformTotalCents).toBe(0);
227
251
  expect(r.guestPlatformLineCents).toBe(0);
228
- expect(r.totalChargedCents).toBe(12345);
252
+ if (tier.feeHandling === "HostAbsorbs") {
253
+ expect(r.guestProcessingLineCents).toBe(0);
254
+ expect(r.totalChargedCents).toBe(12345);
255
+ } else {
256
+ expect(r.guestProcessingLineCents).toBe(
257
+ calculateStripeProcessingFeeCents(12345),
258
+ );
259
+ expect(r.totalChargedCents).toBe(
260
+ 12345 + calculateStripeProcessingFeeCents(12345),
261
+ );
262
+ }
229
263
  expect(r.applicationFeeAmountCents).toBe(r.stripeProcessingCents);
230
264
  }
231
265
  });
@@ -389,6 +423,68 @@ describe("PaymentUtils - Core Functions", () => {
389
423
  });
390
424
  });
391
425
 
426
+ describe("guest ticket checkout breakdown (No Fees for Attendees)", () => {
427
+ test("HostAbsorbs — $20 ticket → $20 due, no processing line", () => {
428
+ const r = computeGuestTicketCheckoutBreakdown({
429
+ discountedSubtotalCents: 2000,
430
+ platformFeeEnabled: false,
431
+ platformFeeRate: 0.03,
432
+ feeHandling: "HostAbsorbs",
433
+ bashPassWaivesGuestFee: false,
434
+ });
435
+ expect(r.ticketSubtotalCents).toBe(2000);
436
+ expect(r.guestProcessingLineCents).toBe(0);
437
+ expect(r.totalDueCents).toBe(2000);
438
+ });
439
+
440
+ test("GuestPays — $20 ticket → $20.88 all-in with processing line on subtotal", () => {
441
+ const processing = calculateStripeProcessingFeeCents(2000);
442
+ expect(processing).toBe(88);
443
+ const r = computeGuestTicketCheckoutBreakdown({
444
+ discountedSubtotalCents: 2000,
445
+ platformFeeEnabled: false,
446
+ platformFeeRate: 0.03,
447
+ feeHandling: "GuestPays",
448
+ bashPassWaivesGuestFee: false,
449
+ });
450
+ expect(r.guestProcessingLineCents).toBe(88);
451
+ expect(r.totalDueCents).toBe(2088);
452
+ });
453
+
454
+ test("guestCheckoutHasNoAddedFees and display helpers", () => {
455
+ expect(
456
+ guestCheckoutHasNoAddedFees({ feeHandling: "HostAbsorbs" }),
457
+ ).toBe(true);
458
+ expect(
459
+ guestCheckoutHasNoAddedFees({ feeHandling: "GuestPays" }),
460
+ ).toBe(false);
461
+ expect(
462
+ guestCheckoutHasNoAddedFees({
463
+ feeHandling: "HostAbsorbs",
464
+ externalTicketUrl: "https://eventbrite.com/x",
465
+ }),
466
+ ).toBe(false);
467
+ expect(hostAbsorbsTicketProcessing("HostAbsorbs")).toBe(true);
468
+ expect(hostAbsorbsTicketProcessing("GuestPays")).toBe(false);
469
+ expect(guestAllInUnitPriceCents(2000, { feeHandling: "HostAbsorbs" })).toBe(
470
+ 2000,
471
+ );
472
+ expect(guestAllInUnitPriceCents(2000, { feeHandling: "GuestPays" })).toBe(
473
+ 2088,
474
+ );
475
+ expect(
476
+ lowestGuestAllInPriceCents(
477
+ [
478
+ { price: 5000, pricingType: "USD" },
479
+ { price: 2000, pricingType: "USD" },
480
+ { price: 100, pricingType: "BASHPOINTS" },
481
+ ],
482
+ { feeHandling: "HostAbsorbs" },
483
+ ),
484
+ ).toBe(2000);
485
+ });
486
+ });
487
+
392
488
  describe("splitBashPlatformFeeForTicketCheckout edge cases", () => {
393
489
  test("returns zeros when platform fee disabled", () => {
394
490
  expect(
@@ -7,6 +7,8 @@ import { DateTime } from "luxon";
7
7
  import {
8
8
  getCompactRunFirstAndLastOccurrence,
9
9
  getRecurringBashEventPossibleLuxonTimes,
10
+ occurrenceOverrideKey,
11
+ parseOccurrenceOverrides,
10
12
  } from "../recurrenceUtils.js";
11
13
 
12
14
  function buildRecurrence(partial: Partial<Recurrence>): Recurrence {
@@ -94,3 +96,100 @@ describe("getCompactRunFirstAndLastOccurrence", () => {
94
96
  ).toBeNull();
95
97
  });
96
98
  });
99
+
100
+ describe("occurrenceOverrideKey", () => {
101
+ it("returns the same key for Date and ISO string of the same instant", () => {
102
+ const iso = "2026-06-15T20:00:00.000Z";
103
+ expect(occurrenceOverrideKey(new Date(iso))).toBe(
104
+ occurrenceOverrideKey(iso)
105
+ );
106
+ });
107
+ });
108
+
109
+ describe("parseOccurrenceOverrides", () => {
110
+ it("returns empty object for nullish or non-object input", () => {
111
+ expect(parseOccurrenceOverrides(null)).toEqual({});
112
+ expect(parseOccurrenceOverrides(undefined)).toEqual({});
113
+ expect(parseOccurrenceOverrides([])).toEqual({});
114
+ expect(parseOccurrenceOverrides("bad")).toEqual({});
115
+ });
116
+
117
+ it("parses valid override entries and ignores malformed ones", () => {
118
+ expect(
119
+ parseOccurrenceOverrides({
120
+ "Jun 15, 2026 8:00 PM": {
121
+ startDateTime: "2026-06-16T20:00:00.000Z",
122
+ endDateTime: "2026-06-16T22:00:00.000Z",
123
+ },
124
+ bad: { noStart: true },
125
+ empty: null,
126
+ })
127
+ ).toEqual({
128
+ "Jun 15, 2026 8:00 PM": {
129
+ startDateTime: "2026-06-16T20:00:00.000Z",
130
+ endDateTime: "2026-06-16T22:00:00.000Z",
131
+ },
132
+ });
133
+ });
134
+ });
135
+
136
+ describe("occurrence exceptions in getRecurringBashEventPossibleLuxonTimes", () => {
137
+ it("drops skipped occurrences from excludedDates", () => {
138
+ const base = DateTime.utc().plus({ weeks: 2 }).startOf("day");
139
+ const start = base
140
+ .set({ hour: 20, minute: 0, second: 0, millisecond: 0 })
141
+ .toJSDate();
142
+ const recurrence = buildRecurrence({
143
+ frequency: RecurringFrequency.Daily,
144
+ interval: 1,
145
+ repeatCount: 3,
146
+ endsType: RecurrenceEndsType.AFTER_COUNT,
147
+ });
148
+
149
+ const baseline = getRecurringBashEventPossibleLuxonTimes(start, recurrence);
150
+ expect(baseline).toHaveLength(3);
151
+
152
+ const skipped = baseline[1];
153
+ const withSkip = buildRecurrence({
154
+ ...recurrence,
155
+ excludedDates: [skipped.toJSDate()],
156
+ } as Partial<Recurrence>);
157
+
158
+ const result = getRecurringBashEventPossibleLuxonTimes(start, withSkip);
159
+ expect(result).toHaveLength(2);
160
+ expect(result.map((d) => d.toMillis())).not.toContain(skipped.toMillis());
161
+ });
162
+
163
+ it("applies moved occurrences from occurrenceOverrides", () => {
164
+ const base = DateTime.utc().plus({ weeks: 2 }).startOf("day");
165
+ const start = base
166
+ .set({ hour: 20, minute: 0, second: 0, millisecond: 0 })
167
+ .toJSDate();
168
+ const recurrence = buildRecurrence({
169
+ frequency: RecurringFrequency.Daily,
170
+ interval: 1,
171
+ repeatCount: 3,
172
+ endsType: RecurrenceEndsType.AFTER_COUNT,
173
+ });
174
+
175
+ const baseline = getRecurringBashEventPossibleLuxonTimes(start, recurrence);
176
+ const original = baseline[1];
177
+ const movedStart = original.plus({ days: 2 }).toISO();
178
+ const withMove = buildRecurrence({
179
+ ...recurrence,
180
+ occurrenceOverrides: {
181
+ [occurrenceOverrideKey(original)]: {
182
+ startDateTime: movedStart!,
183
+ endDateTime: null,
184
+ },
185
+ },
186
+ } as Partial<Recurrence>);
187
+
188
+ const result = getRecurringBashEventPossibleLuxonTimes(start, withMove);
189
+ expect(result).toHaveLength(3);
190
+ expect(result.map((d) => d.toMillis())).toContain(
191
+ DateTime.fromISO(movedStart!).toMillis()
192
+ );
193
+ expect(result.map((d) => d.toMillis())).not.toContain(original.toMillis());
194
+ });
195
+ });