Merge branch 'develop' into MED-97

This commit is contained in:
2025-09-26 17:01:24 +03:00
86 changed files with 11249 additions and 3151 deletions

View File

@@ -17,6 +17,9 @@ import { AccountWithParams } from "@/packages/features/accounts/src/types/accoun
import { createI18nServerInstance } from "~/lib/i18n/i18n.server";
import { getSupabaseServerAdminClient } from "@/packages/supabase/src/clients/server-admin-client";
import { createNotificationsApi } from "@/packages/features/notifications/src/server/api";
import { FailureReason } from '~/lib/types/connected-online';
import { getOrderedTtoServices } from '~/lib/services/reservation.service';
import { bookAppointment } from '~/lib/services/connected-online.service';
const ANALYSIS_PACKAGES_TYPE_HANDLE = 'analysis-packages';
const ANALYSIS_TYPE_HANDLE = 'synlab-analysis';
@@ -77,14 +80,14 @@ export const initiatePayment = async ({
if (!montonioPaymentSessionId) {
throw new Error('Montonio payment session ID is missing');
}
const url = await handleNavigateToPayment({
const props = await handleNavigateToPayment({
language,
paymentSessionId: montonioPaymentSessionId,
amount: totalByMontonio,
currencyCode: cart.currency_code,
cartId: cart.id,
});
return { url };
return { ...props, isFullyPaidByBenefits };
} else {
// place order if all paid already
const { orderId } = await handlePlaceOrder({ cart });
@@ -109,13 +112,13 @@ export const initiatePayment = async ({
if (!webhookResponse.ok) {
throw new Error('Failed to send company benefits webhook');
}
return { isFullyPaidByBenefits, orderId };
return { isFullyPaidByBenefits, orderId, unavailableLineItemIds: [] };
}
} catch (error) {
console.error('Error initiating payment', error);
}
return { url: null }
return { url: null, isFullyPaidByBenefits: false, orderId: null, unavailableLineItemIds: [] };
}
export async function handlePlaceOrder({
@@ -136,6 +139,8 @@ export async function handlePlaceOrder({
medusaOrder,
});
const orderContainsSynlabItems = !!orderedAnalysisElements?.length;
try {
const existingAnalysisOrder = await getAnalysisOrder({
medusaOrderId: medusaOrder.id,
@@ -148,15 +153,38 @@ export async function handlePlaceOrder({
// ignored
}
const orderId = await createAnalysisOrder({
medusaOrder,
orderedAnalysisElements,
});
let orderId: number | undefined = undefined;
if (orderContainsSynlabItems) {
orderId = await createAnalysisOrder({
medusaOrder,
orderedAnalysisElements,
});
}
const orderResult = await getOrderResultParameters(medusaOrder);
const { medusaOrderId, email, analysisPackageOrder, analysisItemsOrder } =
orderResult;
const orderedTtoServices = await getOrderedTtoServices({ medusaOrder });
let bookServiceResults: {
success: boolean;
reason?: FailureReason;
serviceId?: number;
}[] = [];
if (orderedTtoServices?.length) {
const bookingPromises = orderedTtoServices.map((service) =>
bookAppointment(
service.service_id,
service.clinic_id,
service.service_user_id,
service.sync_user_id,
service.start_time,
),
);
bookServiceResults = await Promise.all(bookingPromises);
}
if (email) {
if (analysisPackageOrder) {
await sendAnalysisPackageOrderEmail({
@@ -184,6 +212,17 @@ export async function handlePlaceOrder({
await sendOrderToMedipost({ medusaOrderId, orderedAnalysisElements });
}
if (bookServiceResults.some(({ success }) => success === false)) {
const failedServiceBookings = bookServiceResults.filter(
({ success }) => success === false,
);
return {
success: false,
failedServiceBookings,
orderId,
};
}
return { success: true, orderId };
} catch (error) {
console.error('Failed to place order', error);