feat(MED-161): update results sync validations
This commit is contained in:
@@ -34,7 +34,9 @@ export async function createMedipostActionLog({
|
|||||||
medusaOrderId,
|
medusaOrderId,
|
||||||
responseXml,
|
responseXml,
|
||||||
hasError = false,
|
hasError = false,
|
||||||
}: {
|
medipostExternalOrderId,
|
||||||
|
medipostPrivateMessageId,
|
||||||
|
}: {
|
||||||
action:
|
action:
|
||||||
| 'send_order_to_medipost'
|
| 'send_order_to_medipost'
|
||||||
| 'sync_analysis_results_from_medipost'
|
| 'sync_analysis_results_from_medipost'
|
||||||
@@ -45,7 +47,9 @@ export async function createMedipostActionLog({
|
|||||||
medusaOrderId?: string | null;
|
medusaOrderId?: string | null;
|
||||||
responseXml?: string | null;
|
responseXml?: string | null;
|
||||||
hasError?: boolean;
|
hasError?: boolean;
|
||||||
}) {
|
medipostExternalOrderId?: string | null;
|
||||||
|
medipostPrivateMessageId?: string | null;
|
||||||
|
}) {
|
||||||
await getSupabaseServerAdminClient()
|
await getSupabaseServerAdminClient()
|
||||||
.schema('medreport')
|
.schema('medreport')
|
||||||
.from('medipost_actions')
|
.from('medipost_actions')
|
||||||
@@ -56,8 +60,9 @@ export async function createMedipostActionLog({
|
|||||||
medusa_order_id: medusaOrderId,
|
medusa_order_id: medusaOrderId,
|
||||||
response_xml: responseXml,
|
response_xml: responseXml,
|
||||||
has_error: hasError,
|
has_error: hasError,
|
||||||
|
medipost_external_order_id: medipostExternalOrderId,
|
||||||
|
medipost_private_message_id: medipostPrivateMessageId,
|
||||||
})
|
})
|
||||||
.select('id')
|
.select('id')
|
||||||
.throwOnError();
|
.throwOnError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
try {
|
||||||
|
analysisOrder = await getAnalysisOrder({ analysisOrderId })
|
||||||
medusaOrderId = analysisOrder.medusa_order_id;
|
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;
|
||||||
|
|||||||
Reference in New Issue
Block a user