feat(MED-161): update results sync validations

This commit is contained in:
2025-09-17 11:17:23 +03:00
parent b729ad9ffa
commit ecc8c2b982
2 changed files with 75 additions and 42 deletions

View File

@@ -28,36 +28,41 @@ export function getLatestMessage({
} }
export async function createMedipostActionLog({ export async function createMedipostActionLog({
action, action,
xml, xml,
hasAnalysisResults = false, hasAnalysisResults = false,
medusaOrderId, medusaOrderId,
responseXml, responseXml,
hasError = false, hasError = false,
}: { medipostExternalOrderId,
action: medipostPrivateMessageId,
| 'send_order_to_medipost' }: {
| 'sync_analysis_results_from_medipost' action:
| 'send_fake_analysis_results_to_medipost' | 'send_order_to_medipost'
| 'send_analysis_results_to_medipost'; | 'sync_analysis_results_from_medipost'
xml: string; | 'send_fake_analysis_results_to_medipost'
hasAnalysisResults?: boolean; | 'send_analysis_results_to_medipost';
medusaOrderId?: string | null; xml: string;
responseXml?: string | null; hasAnalysisResults?: boolean;
hasError?: boolean; medusaOrderId?: string | null;
}) { responseXml?: string | null;
await getSupabaseServerAdminClient() hasError?: boolean;
.schema('medreport') medipostExternalOrderId?: string | null;
.from('medipost_actions') medipostPrivateMessageId?: string | null;
.insert({ }) {
action, await getSupabaseServerAdminClient()
xml, .schema('medreport')
has_analysis_results: hasAnalysisResults, .from('medipost_actions')
medusa_order_id: medusaOrderId, .insert({
response_xml: responseXml, action,
has_error: hasError, xml,
}) has_analysis_results: hasAnalysisResults,
.select('id') medusa_order_id: medusaOrderId,
.throwOnError(); response_xml: responseXml,
} has_error: hasError,
medipost_external_order_id: medipostExternalOrderId,
medipost_private_message_id: medipostPrivateMessageId,
})
.select('id')
.throwOnError();
}

View File

@@ -1,5 +1,8 @@
'use server'; 'use server';
import type { PostgrestError } from '@supabase/supabase-js';
import axios from 'axios';
import { import {
GetMessageListResponse, GetMessageListResponse,
MedipostAction, MedipostAction,
@@ -10,7 +13,7 @@ import type {
MedipostOrderResponse MedipostOrderResponse
} from '@/packages/shared/src/types/medipost-analysis'; } from '@/packages/shared/src/types/medipost-analysis';
import { toArray } from '@/lib/utils'; import { toArray } from '@/lib/utils';
import axios from 'axios'; import type { AnalysisOrder } from '~/lib/types/analysis-order';
import { Tables } from '@kit/supabase/database'; import { Tables } from '@kit/supabase/database';
import { getSupabaseServerAdminClient } from '@/packages/supabase/src/clients/server-admin-client'; 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( const { message: privateMessageContent, xml: privateMessageXml } = await getPrivateMessage(
privateMessage.messageId, privateMessageId,
); );
const messageResponse = privateMessageContent?.Saadetis?.Vastus; 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({ await createMedipostActionLog({
action: 'sync_analysis_results_from_medipost', action: 'sync_analysis_results_from_medipost',
xml: privateMessageXml, xml: privateMessageXml,
hasAnalysisResults: false, hasAnalysisResults: false,
medipostPrivateMessageId: privateMessageId,
medusaOrderId,
medipostExternalOrderId,
hasError: true,
}); });
return { return {
messageId, messageId,
@@ -226,21 +236,39 @@ export async function readPrivateMessageResponse({
}; };
} }
const analysisOrder = await getAnalysisOrder({ analysisOrderId: analysisOrderId }) let analysisOrder: AnalysisOrder;
medusaOrderId = analysisOrder.medusa_order_id; 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'>; let order: Tables<{ schema: 'medreport' }, 'analysis_orders'>;
try { try {
order = await getAnalysisOrder({ medusaOrderId }); order = await getAnalysisOrder({ medusaOrderId });
} catch (e) { } catch (e) {
if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) { if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) {
await deletePrivateMessage(privateMessage.messageId); await deletePrivateMessage(privateMessageId);
} }
throw new Error(`Order not found by Medipost message ValisTellimuseId=${medusaOrderId}`); throw new Error(`Order not found by Medipost message ValisTellimuseId=${medusaOrderId}`);
} }
const status = await syncPrivateMessage({ messageResponse, order }); 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) { if (status.isPartial) {
await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' }); await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'PARTIAL_ANALYSIS_RESPONSE' });
hasAnalysisResponse = true; hasAnalysisResponse = true;
@@ -248,7 +276,7 @@ export async function readPrivateMessageResponse({
} else if (status.isCompleted) { } else if (status.isCompleted) {
await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' }); await updateAnalysisOrderStatus({ medusaOrderId, orderStatus: 'FULL_ANALYSIS_RESPONSE' });
if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) { if (IS_ENABLED_DELETE_PRIVATE_MESSAGE) {
await deletePrivateMessage(privateMessage.messageId); await deletePrivateMessage(privateMessageId);
} }
hasAnalysisResponse = true; hasAnalysisResponse = true;
hasFullAnalysisResponse = true; hasFullAnalysisResponse = true;