From 4a06059a25a2f7470cdc1b7a9dd937d3d07dab11 Mon Sep 17 00:00:00 2001 From: Karli Date: Thu, 4 Sep 2025 13:18:42 +0300 Subject: [PATCH] medusa product can have either analysiselement or analysis originalId --- app/api/job/medipost-retry-dispatch/route.ts | 4 +-- app/api/job/test-medipost-responses/route.ts | 8 +++--- app/api/order/medipost-test-response/route.ts | 13 +++++----- .../cart/montonio-callback/actions.ts | 4 +-- lib/services/analyses.service.ts | 14 +++++++--- lib/services/medipost.service.ts | 26 +++++++++++++------ lib/services/order.service.ts | 6 ++--- .../src/lib/data/products.ts | 4 +-- 8 files changed, 47 insertions(+), 32 deletions(-) diff --git a/app/api/job/medipost-retry-dispatch/route.ts b/app/api/job/medipost-retry-dispatch/route.ts index 2258e2b..1a97cef 100644 --- a/app/api/job/medipost-retry-dispatch/route.ts +++ b/app/api/job/medipost-retry-dispatch/route.ts @@ -1,7 +1,7 @@ import { NextRequest, NextResponse } from "next/server"; import loadEnv from "../handler/load-env"; import validateApiKey from "../handler/validate-api-key"; -import { getOrderedAnalysisElementsIds, sendOrderToMedipost } from "~/lib/services/medipost.service"; +import { getOrderedAnalysisIds, sendOrderToMedipost } from "~/lib/services/medipost.service"; import { retrieveOrder } from "@lib/data/orders"; import { getMedipostDispatchTries } from "~/lib/services/audit.service"; @@ -25,7 +25,7 @@ export const POST = async (request: NextRequest) => { try { const medusaOrder = await retrieveOrder(medusaOrderId); - const orderedAnalysisElements = await getOrderedAnalysisElementsIds({ medusaOrder }); + const orderedAnalysisElements = await getOrderedAnalysisIds({ medusaOrder }); await sendOrderToMedipost({ medusaOrderId, orderedAnalysisElements }); console.info("Successfully sent order to medipost"); return NextResponse.json({ diff --git a/app/api/job/test-medipost-responses/route.ts b/app/api/job/test-medipost-responses/route.ts index 3b32794..c745b98 100644 --- a/app/api/job/test-medipost-responses/route.ts +++ b/app/api/job/test-medipost-responses/route.ts @@ -3,7 +3,7 @@ import { getAnalysisOrdersAdmin } from "~/lib/services/order.service"; import { composeOrderTestResponseXML, sendPrivateMessageTestResponse } from "~/lib/services/medipostTest.service"; import { retrieveOrder } from "@lib/data"; import { getAccountAdmin } from "~/lib/services/account.service"; -import { getOrderedAnalysisElementsIds } from "~/lib/services/medipost.service"; +import { getOrderedAnalysisIds } from "~/lib/services/medipost.service"; import loadEnv from "../handler/load-env"; import validateApiKey from "../handler/validate-api-key"; @@ -24,7 +24,7 @@ export async function POST(request: NextRequest) { const medusaOrder = await retrieveOrder(medusaOrderId) const account = await getAccountAdmin({ primaryOwnerUserId: medreportOrder.user_id }); - const orderedAnalysisElementsIds = await getOrderedAnalysisElementsIds({ medusaOrder }); + const orderedAnalysisElementsIds = await getOrderedAnalysisIds({ medusaOrder }); console.info(`Sending test response for order=${medusaOrderId} with ${orderedAnalysisElementsIds.length} ordered analysis elements`); const idsToSend = orderedAnalysisElementsIds; @@ -35,8 +35,8 @@ export async function POST(request: NextRequest) { lastName: account.last_name ?? '', phone: account.phone ?? '', }, - orderedAnalysisElementsIds: idsToSend.map(({ analysisElementId }) => analysisElementId), - orderedAnalysesIds: [], + orderedAnalysisElementsIds: idsToSend.map(({ analysisElementId }) => analysisElementId).filter(Boolean) as number[], + orderedAnalysesIds: idsToSend.map(({ analysisId }) => analysisId).filter(Boolean) as number[], orderId: medusaOrderId, orderCreatedAt: new Date(medreportOrder.created_at), }); diff --git a/app/api/order/medipost-test-response/route.ts b/app/api/order/medipost-test-response/route.ts index a54e1fe..2302631 100644 --- a/app/api/order/medipost-test-response/route.ts +++ b/app/api/order/medipost-test-response/route.ts @@ -3,7 +3,7 @@ import { getOrder } from "~/lib/services/order.service"; import { composeOrderTestResponseXML, sendPrivateMessageTestResponse } from "~/lib/services/medipostTest.service"; import { retrieveOrder } from "@lib/data"; import { getAccountAdmin } from "~/lib/services/account.service"; -import { createMedipostActionLog, getOrderedAnalysisElementsIds } from "~/lib/services/medipost.service"; +import { createMedipostActionLog, getOrderedAnalysisIds } from "~/lib/services/medipost.service"; export async function POST(request: Request) { // const isDev = process.env.NODE_ENV === 'development'; @@ -11,16 +11,15 @@ export async function POST(request: Request) { // return NextResponse.json({ error: 'This endpoint is only available in development mode' }, { status: 403 }); // } - const { medusaOrderId, maxItems = null } = await request.json(); + const { medusaOrderId } = await request.json(); const medusaOrder = await retrieveOrder(medusaOrderId) const medreportOrder = await getOrder({ medusaOrderId }); const account = await getAccountAdmin({ primaryOwnerUserId: medreportOrder.user_id }); - const orderedAnalysisElementsIds = await getOrderedAnalysisElementsIds({ medusaOrder }); + const orderedAnalysisElementsIds = await getOrderedAnalysisIds({ medusaOrder }); - console.info(`Sending test response for order=${medusaOrderId} with ${orderedAnalysisElementsIds.length} (${maxItems ?? 'all'}) ordered analysis elements`); - const idsToSend = typeof maxItems === 'number' ? orderedAnalysisElementsIds.slice(0, maxItems) : orderedAnalysisElementsIds; + console.info(`Sending test response for order=${medusaOrderId} with ${orderedAnalysisElementsIds.length} ordered analysis elements`); const messageXml = await composeOrderTestResponseXML({ person: { idCode: account.personal_code!, @@ -28,8 +27,8 @@ export async function POST(request: Request) { lastName: account.last_name ?? '', phone: account.phone ?? '', }, - orderedAnalysisElementsIds: idsToSend.map(({ analysisElementId }) => analysisElementId), - orderedAnalysesIds: [], + orderedAnalysisElementsIds: orderedAnalysisElementsIds.map(({ analysisElementId }) => analysisElementId).filter(Boolean) as number[], + orderedAnalysesIds: orderedAnalysisElementsIds.map(({ analysisId }) => analysisId).filter(Boolean) as number[], orderId: medusaOrderId, orderCreatedAt: new Date(medreportOrder.created_at), }); diff --git a/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts b/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts index 787acd5..9ef4799 100644 --- a/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts +++ b/app/home/(user)/(dashboard)/cart/montonio-callback/actions.ts @@ -8,7 +8,7 @@ import { listProductTypes } from "@lib/data/products"; import { placeOrder, retrieveCart } from "@lib/data/cart"; import { createI18nServerInstance } from "~/lib/i18n/i18n.server"; import { createOrder } from '~/lib/services/order.service'; -import { getOrderedAnalysisElementsIds, sendOrderToMedipost } from '~/lib/services/medipost.service'; +import { getOrderedAnalysisIds, sendOrderToMedipost } from '~/lib/services/medipost.service'; import { createNotificationsApi } from '@kit/notifications/api'; import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { AccountWithParams } from '@kit/accounts/api'; @@ -114,7 +114,7 @@ export async function processMontonioCallback(orderToken: string) { const medusaOrder = await placeOrder(cartId, { revalidateCacheTags: false }); - const orderedAnalysisElements = await getOrderedAnalysisElementsIds({ medusaOrder }); + const orderedAnalysisElements = await getOrderedAnalysisIds({ medusaOrder }); const orderId = await createOrder({ medusaOrder, orderedAnalysisElements }); const { productTypes } = await listProductTypes(); diff --git a/lib/services/analyses.service.ts b/lib/services/analyses.service.ts index 81eaa56..0127e09 100644 --- a/lib/services/analyses.service.ts +++ b/lib/services/analyses.service.ts @@ -105,12 +105,18 @@ export const createMedusaSyncSuccessEntry = async () => { }); } -export async function getAnalyses({ ids }: { ids: number[] }): Promise { - const { data } = await getSupabaseServerAdminClient() +export async function getAnalyses({ ids, originalIds }: { ids?: number[], originalIds?: string[] }): Promise { + const query = getSupabaseServerAdminClient() .schema('medreport') .from('analyses') - .select(`*, analysis_elements(*, analysis_groups(*))`) - .in('id', ids); + .select(`*, analysis_elements(*, analysis_groups(*))`); + if (Array.isArray(ids)) { + query.in('id', ids); + } + if (Array.isArray(originalIds)) { + query.in('analysis_id_original', originalIds); + } + const { data } = await query.throwOnError(); return data as unknown as AnalysesWithGroupsAndElements; } diff --git a/lib/services/medipost.service.ts b/lib/services/medipost.service.ts index 6f91e62..90bdce8 100644 --- a/lib/services/medipost.service.ts +++ b/lib/services/medipost.service.ts @@ -666,7 +666,7 @@ async function syncPrivateMessage({ unit: element.Mootyhik ?? null, original_response_element: element, analysis_name: element.UuringNimi || element.KNimetus, - comment: element.UuringuKommentaar + comment: element.UuringuKommentaar ?? '', })), ); } @@ -715,7 +715,7 @@ export async function sendOrderToMedipost({ orderedAnalysisElements, }: { medusaOrderId: string; - orderedAnalysisElements: { analysisElementId: number }[]; + orderedAnalysisElements: { analysisElementId?: number; analysisId?: number }[]; }) { const medreportOrder = await getOrder({ medusaOrderId }); const account = await getAccountAdmin({ primaryOwnerUserId: medreportOrder.user_id }); @@ -727,8 +727,8 @@ export async function sendOrderToMedipost({ lastName: account.last_name ?? '', phone: account.phone ?? '', }, - orderedAnalysisElementsIds: orderedAnalysisElements.map(({ analysisElementId }) => analysisElementId), - orderedAnalysesIds: [], + orderedAnalysisElementsIds: orderedAnalysisElements.map(({ analysisElementId }) => analysisElementId).filter(Boolean) as number[], + orderedAnalysesIds: orderedAnalysisElements.map(({ analysisId }) => analysisId).filter(Boolean) as number[], orderId: medusaOrderId, orderCreatedAt: new Date(medreportOrder.created_at), comment: '', @@ -784,12 +784,13 @@ export async function sendOrderToMedipost({ await updateOrderStatus({ medusaOrderId, orderStatus: 'PROCESSING' }); } -export async function getOrderedAnalysisElementsIds({ +export async function getOrderedAnalysisIds({ medusaOrder, }: { medusaOrder: StoreOrder; }): Promise<{ - analysisElementId: number; + analysisElementId?: number; + analysisId?: number; }[]> { const countryCodes = await listRegions(); const countryCode = countryCodes[0]!.countries![0]!.iso_2!; @@ -802,6 +803,14 @@ export async function getOrderedAnalysisElementsIds({ return analysisElements.map(({ id }) => ({ analysisElementId: id })); } + async function getOrderedAnalyses(medusaOrder: StoreOrder) { + const originalIds = (medusaOrder?.items ?? []) + .map((a) => a.product?.metadata?.analysisIdOriginal) + .filter((a) => typeof a === 'string') as string[]; + const analyses = await getAnalyses({ originalIds }); + return analyses.map(({ id }) => ({ analysisId: id })); + } + async function getOrderedAnalysisPackages(medusaOrder: StoreOrder) { const orderedPackages = (medusaOrder?.items ?? []).filter(({ product }) => product?.handle.startsWith(ANALYSIS_PACKAGE_HANDLE_PREFIX)); const orderedPackageIds = orderedPackages.map(({ product }) => product?.id).filter(Boolean) as string[]; @@ -841,12 +850,13 @@ export async function getOrderedAnalysisElementsIds({ return analysisElements.map(({ id }) => ({ analysisElementId: id })); } - const [analysisPackageElements, orderedAnalysisElements] = await Promise.all([ + const [analysisPackageElements, orderedAnalysisElements, orderedAnalyses] = await Promise.all([ getOrderedAnalysisPackages(medusaOrder), getOrderedAnalysisElements(medusaOrder), + getOrderedAnalyses(medusaOrder), ]); - return [...analysisPackageElements, ...orderedAnalysisElements]; + return [...analysisPackageElements, ...orderedAnalysisElements, ...orderedAnalyses]; } export async function createMedipostActionLog({ diff --git a/lib/services/order.service.ts b/lib/services/order.service.ts index e7ca441..487153a 100644 --- a/lib/services/order.service.ts +++ b/lib/services/order.service.ts @@ -10,7 +10,7 @@ export async function createOrder({ orderedAnalysisElements, }: { medusaOrder: StoreOrder; - orderedAnalysisElements: { analysisElementId: number }[]; + orderedAnalysisElements: { analysisElementId?: number; analysisId?: number }[]; }) { const supabase = getSupabaseServerClient(); @@ -21,8 +21,8 @@ export async function createOrder({ const orderResult = await supabase.schema('medreport') .from('analysis_orders') .insert({ - analysis_element_ids: orderedAnalysisElements.map(({ analysisElementId }) => analysisElementId), - analysis_ids: [], + analysis_element_ids: orderedAnalysisElements.map(({ analysisElementId }) => analysisElementId).filter(Boolean) as number[], + analysis_ids: orderedAnalysisElements.map(({ analysisId }) => analysisId).filter(Boolean) as number[], status: 'QUEUED', user_id: user.id, medusa_order_id: medusaOrder.id, diff --git a/packages/features/medusa-storefront/src/lib/data/products.ts b/packages/features/medusa-storefront/src/lib/data/products.ts index d242b3c..a8ea25d 100644 --- a/packages/features/medusa-storefront/src/lib/data/products.ts +++ b/packages/features/medusa-storefront/src/lib/data/products.ts @@ -14,7 +14,7 @@ export const listProducts = async ({ regionId, }: { pageParam?: number - queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string; id?: string[] } + queryParams?: HttpTypes.FindParams & HttpTypes.StoreProductParams & { "type_id[0]"?: string; id?: string[], category_id?: string } countryCode?: string regionId?: string }): Promise<{ @@ -63,7 +63,7 @@ export const listProducts = async ({ offset, region_id: region?.id, fields: - "*variants.calculated_price,+variants.inventory_quantity,+metadata,+tags", + "*variants.calculated_price,+variants.inventory_quantity,+metadata,+tags,+status", ...queryParams, }, headers,