|
|
|
|
@@ -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}`);
|
|
|
|
|
}
|
|
|
|
|
|