From 961f72652018163fd8d4fb19ced6d6ee0573bbe1 Mon Sep 17 00:00:00 2001 From: Helena Date: Fri, 19 Sep 2025 17:28:45 +0300 Subject: [PATCH] translations, remove random empty lines, refactor --- lib/services/audit/cartEntries.ts | 40 ++++++ lib/services/medusaCart.service.ts | 124 +++++++----------- lib/services/reservation.service.ts | 33 ++--- public/locales/en/booking.json | 12 +- public/locales/en/cart.json | 4 +- public/locales/en/common.json | 4 +- public/locales/en/orders.json | 27 +++- public/locales/ru/booking.json | 8 +- public/locales/ru/cart.json | 4 +- public/locales/ru/orders.json | 23 +++- ...onnected_online_service_provider_table.sql | 2 +- 11 files changed, 166 insertions(+), 115 deletions(-) create mode 100644 lib/services/audit/cartEntries.ts diff --git a/lib/services/audit/cartEntries.ts b/lib/services/audit/cartEntries.ts new file mode 100644 index 0000000..4b45b26 --- /dev/null +++ b/lib/services/audit/cartEntries.ts @@ -0,0 +1,40 @@ +import { getSupabaseServerClient } from '@kit/supabase/server-client'; + +export const createCartEntriesLog = async ({ + operation, + accountId, + cartId, + variantId, + comment, +}: { + operation: string; + accountId: string; + cartId: string; + variantId?: string; + comment?: string; +}) => { + try { + const supabase = getSupabaseServerClient(); + + const { + data: { user }, + error: userError, + } = await supabase.auth.getUser(); + + if (userError || !user) { + console.error('No authenticated user found; skipping audit insert'); + return; + } + + return supabase.schema('audit').from('cart_entries').insert({ + operation, + account_id: accountId, + cart_id: cartId, + changed_by: user.id, + variant_id: variantId, + comment, + }); + } catch (error) { + console.error('Failed to insert doctor page view log', error); + } +}; diff --git a/lib/services/medusaCart.service.ts b/lib/services/medusaCart.service.ts index 1da98b3..46f2f08 100644 --- a/lib/services/medusaCart.service.ts +++ b/lib/services/medusaCart.service.ts @@ -5,25 +5,13 @@ import { MontonioOrderHandlerService } from '@/packages/billing/montonio/src'; import { addToCart, deleteLineItem, retrieveCart } from '@lib/data/cart'; import { getCartId } from '@lib/data/cookies'; import { StoreCartLineItem, StoreProductVariant } from '@medusajs/types'; -import { z } from 'zod'; - - - -import { getSupabaseServerClient } from '@kit/supabase/server-client'; - - - -import { cancelReservation, getOrderedTtoServices } from '~/lib/services/reservation.service'; - - - import { isSameMinute } from 'date-fns'; +import { z } from 'zod'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { cancelReservation, getOrderedTtoServices } from '~/lib/services/reservation.service'; +import { createCartEntriesLog } from './audit/cartEntries'; import { getAvailableAppointmentsForService } from './connected-online.service'; - - - - const env = () => z .object({ @@ -50,8 +38,7 @@ export async function handleAddToCart({ selectedVariant: Pick; countryCode: string; }) { - const supabase = getSupabaseServerClient(); - const { account, user } = await loadCurrentUserAccount(); + const { account } = await loadCurrentUserAccount(); if (!account) { throw new Error('Account not found'); } @@ -63,16 +50,12 @@ export async function handleAddToCart({ countryCode, }); - const { error } = await supabase.schema('audit').from('cart_entries').insert({ - variant_id: selectedVariant.id, + await createCartEntriesLog({ + variantId: selectedVariant.id, operation: 'ADD_TO_CART', - account_id: account.id, - cart_id: newCart.id, - changed_by: user.id, + accountId: account.id, + cartId: newCart.id, }); - if (error) { - throw new Error('Error logging cart entry: ' + error.message); - } return { cart: newCart, addedItem }; } @@ -81,23 +64,18 @@ export async function handleDeleteCartItem({ lineId }: { lineId: string }) { await deleteLineItem(lineId); await cancelReservation(lineId); - const supabase = getSupabaseServerClient(); const cartId = await getCartId(); - const { account, user } = await loadCurrentUserAccount(); + const { account } = await loadCurrentUserAccount(); if (!account) { throw new Error('Account not found'); } - const { error } = await supabase.schema('audit').from('cart_entries').insert({ - variant_id: lineId, + await createCartEntriesLog({ + variantId: lineId, operation: 'REMOVE_FROM_CART', - account_id: account.id, - cart_id: cartId!, - changed_by: user.id, + accountId: account.id, + cartId: cartId!, }); - if (error) { - throw new Error('Error logging cart entry: ' + error.message); - } } export async function handleNavigateToPayment({ @@ -107,8 +85,7 @@ export async function handleNavigateToPayment({ language: string; paymentSessionId: string; }) { - const supabase = getSupabaseServerClient(); - const { account, user } = await loadCurrentUserAccount(); + const { account } = await loadCurrentUserAccount(); if (!account) { throw new Error('Account not found'); } @@ -117,30 +94,33 @@ export async function handleNavigateToPayment({ if (!cart) { throw new Error('No cart found'); } - const orderedTtoServices = await getOrderedTtoServices({ cart }); + const orderedTtoServices = await getOrderedTtoServices({ cart }); - if (orderedTtoServices?.length) { - const unavailableLineItemIds: string[] = [] - for (const ttoService of orderedTtoServices) { - const availabilities = await getAvailableAppointmentsForService( - ttoService.service_id, - ttoService.provider.key, - ttoService.location_sync_id, - new Date(ttoService.start_time), - 1, - ); - const isAvailable = availabilities?.T_Booking?.length ? availabilities.T_Booking.find((timeSlot) => isSameMinute(ttoService.start_time, timeSlot.StartTime)) : false - - if (!isAvailable) { - unavailableLineItemIds.push(ttoService.medusa_cart_line_item_id!) - } - } + if (orderedTtoServices?.length) { + const unavailableLineItemIds: string[] = []; + for (const ttoService of orderedTtoServices) { + const availabilities = await getAvailableAppointmentsForService( + ttoService.service_id, + ttoService.provider.key, + ttoService.location_sync_id, + new Date(ttoService.start_time), + 1, + ); + const isAvailable = availabilities?.T_Booking?.length + ? availabilities.T_Booking.find((timeSlot) => + isSameMinute(ttoService.start_time, timeSlot.StartTime), + ) + : false; - if (unavailableLineItemIds.length) { - return { unavailableLineItemIds } + if (!isAvailable) { + unavailableLineItemIds.push(ttoService.medusa_cart_line_item_id!); } } - + + if (unavailableLineItemIds.length) { + return { unavailableLineItemIds }; + } + } const paymentLink = await new MontonioOrderHandlerService().getMontonioPaymentLink({ @@ -152,17 +132,12 @@ export async function handleNavigateToPayment({ locale: language, merchantReference: `${account.id}:${paymentSessionId}:${cart.id}`, }); - - const { error } = await supabase.schema('audit').from('cart_entries').insert({ - operation: 'NAVIGATE_TO_PAYMENT', - account_id: account.id, - cart_id: cart.id, - changed_by: user.id, + + await createCartEntriesLog({ + operation: 'NAVIGATE_TO_PAYMENT', + accountId: account.id, + cartId: cart.id, }); - - if (error) { - throw new Error('Error logging cart entry: ' + error.message); - } return { url: paymentLink }; } @@ -172,21 +147,16 @@ export async function handleLineItemTimeout({ }: { lineItem: StoreCartLineItem; }) { - const supabase = getSupabaseServerClient(); - const { account, user } = await loadCurrentUserAccount(); + const { account } = await loadCurrentUserAccount(); if (!account) { throw new Error('Account not found'); } await deleteLineItem(lineItem.id); - const { error } = await supabase.schema('audit').from('cart_entries').insert({ + await createCartEntriesLog({ operation: 'LINE_ITEM_TIMEOUT', - account_id: account.id, - cart_id: lineItem.cart_id, - changed_by: user.id, + accountId: account.id, + cartId: lineItem.cart_id, }); - if (error) { - throw new Error('Error logging cart entry: ' + error.message); - } } \ No newline at end of file diff --git a/lib/services/reservation.service.ts b/lib/services/reservation.service.ts index b3a95ac..330a8b2 100644 --- a/lib/services/reservation.service.ts +++ b/lib/services/reservation.service.ts @@ -11,6 +11,7 @@ import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { EnrichedCartItem } from '../../app/home/(user)/_components/cart/types'; import { loadCurrentUserAccount } from '../../app/home/(user)/_lib/server/load-user-account'; +import { createCartEntriesLog } from './audit/cartEntries'; import { handleDeleteCartItem } from './medusaCart.service'; type Locations = Tables<{ schema: 'medreport' }, 'connected_online_locations'>; @@ -305,29 +306,21 @@ export async function updateReservationTime( .throwOnError(); logger.info(`Successfully updated reservation ${reservationData}`); - await supabase - .schema('audit') - .from('cart_entries') - .insert({ - operation: 'CHANGE_RESERVATION', - account_id: account.id, - cart_id: cartId, - changed_by: user.id, - comment: `${reservationData}`, - }); + await createCartEntriesLog({ + operation: 'CHANGE_RESERVATION', + accountId: account.id, + cartId: cartId, + comment: `${reservationData}`, + }); revalidatePath('/home/cart', 'layout'); } catch (e) { logger.error(`Failed to update reservation ${reservationData}`); - await supabase - .schema('audit') - .from('cart_entries') - .insert({ - operation: 'CHANGE_RESERVATION', - account_id: account.id, - cart_id: cartId, - changed_by: user.id, - comment: `${e}`, - }); + await createCartEntriesLog({ + operation: 'CHANGE_RESERVATION', + accountId: account.id, + cartId: cartId, + comment: `${e}`, + }); throw e; } } diff --git a/public/locales/en/booking.json b/public/locales/en/booking.json index 5f30e95..e5eee34 100644 --- a/public/locales/en/booking.json +++ b/public/locales/en/booking.json @@ -5,10 +5,16 @@ "title": "Analysis packages", "description": "Get to know the personal analysis packages and order" }, - "noCategories": "List of services not found, try again later", - "noResults": "No availabilities found for selected dates", - "serviceNotFound": "Service not found", + "noCategories": "Service list not found, please try again later", + "noResults": "No available times on the selected dates", + "services": "Services", + "locations": "Locations", + "showAll": "Show all", + "showAllLocations": "Show all locations", + "bookTimeSuccess": "Time selected", + "bookTimeError": "Failed to select time", "bookTimeLoading": "Selecting time...", + "serviceNotFound": "Service not found", "noProducts": "No products found", "timeSlotUnavailable": "Service availability has changed, please select a new time" } \ No newline at end of file diff --git a/public/locales/en/cart.json b/public/locales/en/cart.json index 63dbf49..544719b 100644 --- a/public/locales/en/cart.json +++ b/public/locales/en/cart.json @@ -16,7 +16,9 @@ "goToDashboard": "Continue", "error": { "title": "Something went wrong", - "description": "Please try again later." + "description": "Please try again later.", + "BOOKING_FAILED": "Service error, please try again later.", + "TIME_SLOT_UNAVAILABLE": "The selected time is not available." }, "timeLeft": "Time left {{timeLeft}}", "timeoutTitle": "Reservation expired", diff --git a/public/locales/en/common.json b/public/locales/en/common.json index cf41acd..7c1978a 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -147,5 +147,7 @@ "language": "Language", "yes": "Yes", "no": "No", - "preferNotToAnswer": "Prefer not to answer" + "preferNotToAnswer": "Prefer not to answer", + "book": "Book", + "change": "Change" } \ No newline at end of file diff --git a/public/locales/en/orders.json b/public/locales/en/orders.json index 7aa958c..c3077f5 100644 --- a/public/locales/en/orders.json +++ b/public/locales/en/orders.json @@ -9,12 +9,27 @@ "status": "Status" }, "status": { - "QUEUED": "Waiting to send to lab", - "PROCESSING": "Waiting for results", - "PARTIAL_ANALYSIS_RESPONSE": "Partial analysis response", - "FULL_ANALYSIS_RESPONSE": "All analysis responses received, waiting for doctor response", - "COMPLETED": "Completed", + "QUEUED": "Queued", + "PROCESSING": "Processing", + "PARTIAL_ANALYSIS_RESPONSE": "Partial results", + "FULL_ANALYSIS_RESPONSE": "All results received", + "COMPLETED": "Confirmed", "REJECTED": "Rejected", - "CANCELLED": "Cancelled" + "CANCELLED": "Cancelled", + "analysisOrder": { + "QUEUED": "Queued", + "PROCESSING": "Sent to Synlab", + "PARTIAL_ANALYSIS_RESPONSE": "Partial results", + "FULL_ANALYSIS_RESPONSE": "All results received, awaiting doctor's summary", + "COMPLETED": "Confirmed", + "REJECTED": "Rejected", + "CANCELLED": "Cancelled" + }, + "ttoService": { + "PENDING": "Started", + "CONFIRMED": "Confirmed", + "REJECTED": "Rejected", + "CANCELLED": "Cancelled" + } } } \ No newline at end of file diff --git a/public/locales/ru/booking.json b/public/locales/ru/booking.json index 4987043..95b163a 100644 --- a/public/locales/ru/booking.json +++ b/public/locales/ru/booking.json @@ -6,7 +6,13 @@ "description": "Ознакомьтесь с персональными пакетами анализов и закажите" }, "noCategories": "Список услуг не найден, попробуйте позже", - "noResults": "Для выбранных дат доступных вариантов не найдено", + "noResults": "На выбранные даты нет свободного времени", + "services": "Услуги", + "locations": "Учреждения", + "showAll": "Показать все", + "showAllLocations": "Показать все учреждения", + "bookTimeSuccess": "Время выбрано", + "bookTimeError": "Не удалось выбрать время", "bookTimeLoading": "Выбор времени...", "serviceNotFound": "Услуга не найдена", "noProducts": "Товары не найдены", diff --git a/public/locales/ru/cart.json b/public/locales/ru/cart.json index 279f3d2..1eae1a4 100644 --- a/public/locales/ru/cart.json +++ b/public/locales/ru/cart.json @@ -16,7 +16,9 @@ "goToDashboard": "Продолжить", "error": { "title": "Что-то пошло не так", - "description": "Пожалуйста, попробуйте позже." + "description": "Пожалуйста, попробуйте позже.", + "BOOKING_FAILED": "Ошибка сервиса, попробуйте позже.", + "TIME_SLOT_UNAVAILABLE": "Выбранное время недоступно." }, "timeLeft": "Осталось времени {{timeLeft}}", "timeoutTitle": "Бронирование истекло", diff --git a/public/locales/ru/orders.json b/public/locales/ru/orders.json index 6669aff..e013422 100644 --- a/public/locales/ru/orders.json +++ b/public/locales/ru/orders.json @@ -10,11 +10,26 @@ }, "status": { "QUEUED": "Отправлено", - "PROCESSING": "Передано в Synlab", + "PROCESSING": "В обработке", "PARTIAL_ANALYSIS_RESPONSE": "Частичные результаты", - "FULL_ANALYSIS_RESPONSE": "Все результаты получены, ожидается заключение врача", + "FULL_ANALYSIS_RESPONSE": "Все результаты получены", "COMPLETED": "Подтверждено", - "REJECTED": "Возвращено", - "CANCELLED": "Отменено" + "REJECTED": "Отклонено", + "CANCELLED": "Отменено", + "analysisOrder": { + "QUEUED": "Отправлено", + "PROCESSING": "Отправлено в Synlab", + "PARTIAL_ANALYSIS_RESPONSE": "Частичные результаты", + "FULL_ANALYSIS_RESPONSE": "Все результаты получены, ожидается заключение врача", + "COMPLETED": "Подтверждено", + "REJECTED": "Отклонено", + "CANCELLED": "Отменено" + }, + "ttoService": { + "PENDING": "Начато", + "CONFIRMED": "Подтверждено", + "REJECTED": "Отклонено", + "CANCELLED": "Отменено" + } } } \ No newline at end of file diff --git a/supabase/migrations/20250908125839_add_connected_online_service_provider_table.sql b/supabase/migrations/20250908125839_add_connected_online_service_provider_table.sql index 85dd813..6c647de 100644 --- a/supabase/migrations/20250908125839_add_connected_online_service_provider_table.sql +++ b/supabase/migrations/20250908125839_add_connected_online_service_provider_table.sql @@ -16,7 +16,7 @@ create table "medreport"."connected_online_service_providers" ( ALTER TABLE audit.request_entries DROP COLUMN personal_code; -ALTER TABLE audit.request_entries ADD COLUMN user_id uuid default auth.uid() references auth.users(id); +ALTER TABLE audit.request_entries ADD COLUMN user_id uuid default auth.uid(); create policy "insert_own" on "audit"."request_entries"