feat(MED-105): update analysis results view to be by analysis order

This commit is contained in:
2025-08-14 12:10:12 +03:00
parent d3b393156a
commit 1285b02f9c
11 changed files with 140 additions and 59 deletions

View File

@@ -36,7 +36,7 @@ import { uniqBy } from 'lodash';
import { Tables } from '@kit/supabase/database';
import { createAnalysisGroup } from './analysis-group.service';
import { getSupabaseServerAdminClient } from '@/packages/supabase/src/clients/server-admin-client';
import { getOrder, updateOrder } from './order.service';
import { getOrder, updateOrderStatus } from './order.service';
import { getAnalysisElements, getAnalysisElementsAdmin } from './analysis-element.service';
import { getAnalyses } from './analyses.service';
import { getAccountAdmin } from './account.service';
@@ -218,24 +218,30 @@ export async function readPrivateMessageResponse({
privateMessage.messageId,
);
const messageResponse = privateMessageContent?.Saadetis?.Vastus;
const medusaOrderId = privateMessageContent?.Saadetis?.Tellimus?.ValisTellimuseId;
if (!messageResponse) {
throw new Error(`Private message response has no results yet`);
if (medusaOrderId === 'order_01K2JSJXR5XVNRWEAGB199RCKP') {
console.info("messageResponse", JSON.stringify(privateMessageContent, null, 2));
}
throw new Error(`Private message response has no results yet for order=${medusaOrderId}`);
}
console.info(`Private message content: ${JSON.stringify(privateMessageContent)}`);
let order: Tables<{ schema: 'medreport' }, 'analysis_orders'>;
try {
order = await getOrder({ medusaOrderId: messageResponse.ValisTellimuseId });
order = await getOrder({ medusaOrderId });
} catch (e) {
await deletePrivateMessage(privateMessage.messageId);
throw new Error(`Order not found by Medipost message ValisTellimuseId=${messageResponse.ValisTellimuseId}`);
throw new Error(`Order not found by Medipost message ValisTellimuseId=${medusaOrderId}`);
}
const status = await syncPrivateMessage({ messageResponse, order });
if (status === 'COMPLETED') {
await updateOrder({ orderId: order.id, orderStatus: 'FULL_ANALYSIS_RESPONSE' });
if (status.isPartial) {
await updateOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' });
messageIdProcessed = privateMessage.messageId;
} else if (status.isCompleted) {
await updateOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' });
await deletePrivateMessage(privateMessage.messageId);
messageIdProcessed = privateMessage.messageId;
}
@@ -559,11 +565,11 @@ function getLatestMessage({
);
}
export async function syncPrivateMessage({
async function syncPrivateMessage({
messageResponse,
order,
}: {
messageResponse: MedipostOrderResponse['Saadetis']['Vastus'];
messageResponse: NonNullable<MedipostOrderResponse['Saadetis']['Vastus']>;
order: Tables<{ schema: 'medreport' }, 'analysis_orders'>;
}) {
const supabase = getSupabaseServerAdminClient()
@@ -606,6 +612,9 @@ export async function syncPrivateMessage({
Tables<{ schema: 'medreport' }, 'analysis_response_elements'>,
'id' | 'created_at' | 'updated_at'
>[] = [];
const analysisResponseId = analysisResponse[0]!.id;
for (const analysisGroup of analysisGroups) {
const groupItems = toArray(
analysisGroup.Uuring as ResponseUuringuGrupp['Uuring'],
@@ -618,7 +627,7 @@ export async function syncPrivateMessage({
responses.push(
...elementAnalysisResponses.map((response) => ({
analysis_element_original_id: element.UuringId,
analysis_response_id: analysisResponse[0]!.id,
analysis_response_id: analysisResponseId,
norm_lower: response.NormAlum?.['#text'] ?? null,
norm_lower_included:
response.NormAlum?.['@_kaasaarvatud'].toLowerCase() === 'jah',
@@ -640,11 +649,11 @@ export async function syncPrivateMessage({
.schema('medreport')
.from('analysis_response_elements')
.delete()
.eq('analysis_response_id', analysisResponse[0].id);
.eq('analysis_response_id', analysisResponseId);
if (deleteError) {
throw new Error(
`Failed to clean up response elements for response id ${analysisResponse[0].id}`,
`Failed to clean up response elements for response id ${analysisResponseId}`,
);
}
@@ -655,12 +664,23 @@ export async function syncPrivateMessage({
if (elementInsertError) {
throw new Error(
`Failed to insert order response elements for response id ${analysisResponse[0].id}`,
`Failed to insert order response elements for response id ${analysisResponseId}`,
);
}
console.info("status", AnalysisOrderStatus[messageResponse.TellimuseOlek], messageResponse.TellimuseOlek);
return AnalysisOrderStatus[messageResponse.TellimuseOlek];
const { data: allOrderResponseElements} = await supabase
.schema('medreport')
.from('analysis_response_elements')
.select('*')
.eq('analysis_response_id', analysisResponseId)
.throwOnError();
const expectedOrderResponseElements = order.analysis_element_ids?.length ?? 0;
if (allOrderResponseElements.length !== expectedOrderResponseElements) {
return { isPartial: true };
}
const statusFromResponse = AnalysisOrderStatus[messageResponse.TellimuseOlek];
return { isCompleted: statusFromResponse === 'COMPLETED' };
}
export async function sendOrderToMedipost({
@@ -688,7 +708,7 @@ export async function sendOrderToMedipost({
});
await sendPrivateMessage(orderXml);
await updateOrder({ orderId: medreportOrder.id, orderStatus: 'PROCESSING' });
await updateOrderStatus({ medusaOrderId, orderStatus: 'PROCESSING' });
}
export async function getOrderedAnalysisElementsIds({
@@ -720,7 +740,7 @@ export async function getOrderedAnalysisElementsIds({
countryCode,
queryParams: { limit: 100, id: orderedPackageIds },
});
console.info(`Order has ${orderedPackagesProducts.length} packages`);
console.info(`Order has ${orderedPackagesProducts.length} packages = ${JSON.stringify(orderedPackageIds, null, 2)}`);
if (orderedPackagesProducts.length !== orderedPackageIds.length) {
throw new Error(`Got ${orderedPackagesProducts.length} ordered packages products, expected ${orderedPackageIds.length}`);
}