feat(MED-161): update results sync validations
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
'use server';
|
||||
|
||||
import type { PostgrestError } from '@supabase/supabase-js';
|
||||
import axios from 'axios';
|
||||
|
||||
import {
|
||||
GetMessageListResponse,
|
||||
MedipostAction,
|
||||
@@ -10,7 +13,7 @@ import type {
|
||||
MedipostOrderResponse
|
||||
} from '@/packages/shared/src/types/medipost-analysis';
|
||||
import { toArray } from '@/lib/utils';
|
||||
import axios from 'axios';
|
||||
import type { AnalysisOrder } from '~/lib/types/analysis-order';
|
||||
|
||||
import { Tables } from '@kit/supabase/database';
|
||||
import { getSupabaseServerAdminClient } from '@/packages/supabase/src/clients/server-admin-client';
|
||||
@@ -201,20 +204,27 @@ export async function readPrivateMessageResponse({
|
||||
};
|
||||
}
|
||||
|
||||
const { messageId: privateMessageId } = privateMessage;
|
||||
const { message: privateMessageContent, xml: privateMessageXml } = await getPrivateMessage(
|
||||
privateMessage.messageId,
|
||||
privateMessageId,
|
||||
);
|
||||
|
||||
const messageResponse = privateMessageContent?.Saadetis?.Vastus;
|
||||
analysisOrderId = Number(privateMessageContent?.Saadetis?.Tellimus?.ValisTellimuseId || messageResponse?.ValisTellimuseId);
|
||||
const medipostExternalOrderId = privateMessageContent?.Saadetis?.Tellimus?.ValisTellimuseId || messageResponse?.ValisTellimuseId;
|
||||
const patientPersonalCode = messageResponse?.Patsient.Isikukood?.toString();
|
||||
analysisOrderId = Number(medipostExternalOrderId);
|
||||
|
||||
const hasInvalidOrderId = isNaN(analysisOrderId)
|
||||
const hasInvalidOrderId = isNaN(analysisOrderId);
|
||||
|
||||
if (hasInvalidOrderId || !messageResponse) {
|
||||
if (hasInvalidOrderId || !messageResponse || !patientPersonalCode) {
|
||||
await createMedipostActionLog({
|
||||
action: 'sync_analysis_results_from_medipost',
|
||||
xml: privateMessageXml,
|
||||
hasAnalysisResults: false,
|
||||
medipostPrivateMessageId: privateMessageId,
|
||||
medusaOrderId,
|
||||
medipostExternalOrderId,
|
||||
hasError: true,
|
||||
});
|
||||
return {
|
||||
messageId,
|
||||
@@ -226,21 +236,39 @@ export async function readPrivateMessageResponse({
|
||||
};
|
||||
}
|
||||
|
||||
const analysisOrder = await getAnalysisOrder({ analysisOrderId: analysisOrderId })
|
||||
medusaOrderId = analysisOrder.medusa_order_id;
|
||||
let analysisOrder: AnalysisOrder;
|
||||
try {
|
||||
analysisOrder = await getAnalysisOrder({ analysisOrderId })
|
||||
medusaOrderId = analysisOrder.medusa_order_id;
|
||||
} catch (e) {
|
||||
throw new Error(`No analysis order found for Medipost message ValisTellimuseId=${medipostExternalOrderId}`);
|
||||
}
|
||||
|
||||
const orderPerson = await getAccountAdmin({ primaryOwnerUserId: analysisOrder.user_id });
|
||||
if (orderPerson.personal_code !== patientPersonalCode) {
|
||||
throw new Error(`Order person personal code does not match Medipost message Patsient.Isikukood=${patientPersonalCode}, orderPerson.personal_code=${orderPerson.personal_code}`);
|
||||
}
|
||||
|
||||
let order: Tables<{ schema: 'medreport' }, 'analysis_orders'>;
|
||||
try {
|
||||
order = await getAnalysisOrder({ medusaOrderId });
|
||||
} catch (e) {
|
||||
if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) {
|
||||
await deletePrivateMessage(privateMessage.messageId);
|
||||
await deletePrivateMessage(privateMessageId);
|
||||
}
|
||||
throw new Error(`Order not found by Medipost message ValisTellimuseId=${medusaOrderId}`);
|
||||
}
|
||||
|
||||
const status = await syncPrivateMessage({ messageResponse, order });
|
||||
|
||||
await createMedipostActionLog({
|
||||
action: 'sync_analysis_results_from_medipost',
|
||||
xml: privateMessageXml,
|
||||
hasAnalysisResults: true,
|
||||
medipostPrivateMessageId: privateMessageId,
|
||||
medusaOrderId,
|
||||
medipostExternalOrderId,
|
||||
});
|
||||
if (status.isPartial) {
|
||||
await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' });
|
||||
hasAnalysisResponse = true;
|
||||
@@ -248,7 +276,7 @@ export async function readPrivateMessageResponse({
|
||||
} else if (status.isCompleted) {
|
||||
await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' });
|
||||
if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) {
|
||||
await deletePrivateMessage(privateMessage.messageId);
|
||||
await deletePrivateMessage(privateMessageId);
|
||||
}
|
||||
hasAnalysisResponse = true;
|
||||
hasFullAnalysisResponse = true;
|
||||
|
||||
Reference in New Issue
Block a user