* refactor: handleNewBooking #3 * refactor: create booking factor * refactor: handleNewBooking * refactor: seats and rescheduleUId * chore: remove comment * fix: type err * chore: add missing statement * chore: use less params and other improvements * chore: name * chore: improvement * fix: type err * Typo fix * chore: fix type err * refactor: more readable * refactor: improve code * fix: conflicts --------- Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com>
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import dayjs from "@calcom/dayjs";
|
|
|
|
import type { getEventTypeResponse } from "./getEventTypesFromDB";
|
|
|
|
type EventType = Pick<getEventTypeResponse, "metadata" | "requiresConfirmation">;
|
|
type PaymentAppData = { price: number };
|
|
|
|
export function getRequiresConfirmationFlags({
|
|
eventType,
|
|
bookingStartTime,
|
|
userId,
|
|
paymentAppData,
|
|
originalRescheduledBookingOrganizerId,
|
|
}: {
|
|
eventType: EventType;
|
|
bookingStartTime: string;
|
|
userId: number | undefined;
|
|
paymentAppData: PaymentAppData;
|
|
originalRescheduledBookingOrganizerId: number | undefined;
|
|
}) {
|
|
const requiresConfirmation = determineRequiresConfirmation(eventType, bookingStartTime);
|
|
const userReschedulingIsOwner = isUserReschedulingOwner(userId, originalRescheduledBookingOrganizerId);
|
|
const isConfirmedByDefault = determineIsConfirmedByDefault(
|
|
requiresConfirmation,
|
|
paymentAppData.price,
|
|
userReschedulingIsOwner
|
|
);
|
|
|
|
return {
|
|
/**
|
|
* Organizer of the booking is rescheduling
|
|
*/
|
|
userReschedulingIsOwner,
|
|
/**
|
|
* Booking won't need confirmation to be ACCEPTED
|
|
*/
|
|
isConfirmedByDefault,
|
|
};
|
|
}
|
|
|
|
function determineRequiresConfirmation(eventType: EventType, bookingStartTime: string): boolean {
|
|
let requiresConfirmation = eventType?.requiresConfirmation;
|
|
const rcThreshold = eventType?.metadata?.requiresConfirmationThreshold;
|
|
|
|
if (rcThreshold) {
|
|
const timeDifference = dayjs(dayjs(bookingStartTime).utc().format()).diff(dayjs(), rcThreshold.unit);
|
|
if (timeDifference > rcThreshold.time) {
|
|
requiresConfirmation = false;
|
|
}
|
|
}
|
|
|
|
return requiresConfirmation;
|
|
}
|
|
|
|
function isUserReschedulingOwner(
|
|
userId: number | undefined,
|
|
originalRescheduledBookingOrganizerId: number | undefined
|
|
): boolean {
|
|
// If the user is not the owner of the event, new booking should be always pending.
|
|
// Otherwise, an owner rescheduling should be always accepted.
|
|
// Before comparing make sure that userId is set, otherwise undefined === undefined
|
|
return !!(userId && originalRescheduledBookingOrganizerId === userId);
|
|
}
|
|
|
|
function determineIsConfirmedByDefault(
|
|
requiresConfirmation: boolean,
|
|
price: number,
|
|
userReschedulingIsOwner: boolean
|
|
): boolean {
|
|
return (!requiresConfirmation && price === 0) || userReschedulingIsOwner;
|
|
}
|