'use server'; import { getClientInstitution, getClientPerson, getPais, getPatient, getProviderInstitution, } from '@/lib/templates/medipost-order'; import { MedipostAction, } from '@/lib/types/medipost'; import axios from 'axios'; import { uniqBy } from 'lodash'; import { Tables } from '@kit/supabase/database'; import { formatDate } from 'date-fns'; import { getAnalyses } from './analyses.service'; import { getAnalysisElementsAdmin } from './analysis-element.service'; import { validateMedipostResponse } from './medipost.service'; const BASE_URL = process.env.MEDIPOST_URL!; const USER = process.env.MEDIPOST_USER!; const PASSWORD = process.env.MEDIPOST_PASSWORD!; const RECIPIENT = process.env.MEDIPOST_RECIPIENT!; export async function sendPrivateMessageTestResponse({ messageXml, }: { messageXml: string; }) { const body = new FormData(); body.append('Action', MedipostAction.SendPrivateMessage); body.append('User', USER); body.append('Password', PASSWORD); body.append('Receiver', RECIPIENT); body.append('MessageType', 'Vastus'); body.append( 'Message', new Blob([messageXml], { type: 'text/xml; charset=UTF-8', }), ); const { data } = await axios.post(BASE_URL, body); await validateMedipostResponse(data); } function getRandomInt(min: number, max: number) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min + 1)) + min; } export async function composeOrderTestResponseXML({ person, orderedAnalysisElementsIds, orderedAnalysesIds, orderId, orderCreatedAt, }: { person: { idCode: string; firstName: string; lastName: string; phone: string; }; orderedAnalysisElementsIds: number[]; orderedAnalysesIds: number[]; orderId: string; orderCreatedAt: Date; }) { const analysisElements = await getAnalysisElementsAdmin({ ids: orderedAnalysisElementsIds }); const analyses = await getAnalyses({ ids: orderedAnalysesIds }); const analysisGroups: Tables<{ schema: 'medreport' }, 'analysis_groups'>[] = uniqBy( ( analysisElements?.flatMap(({ analysis_groups }) => analysis_groups) ?? [] ).concat( analyses?.flatMap( ({ analysis_elements }) => analysis_elements.analysis_groups, ) ?? [], ), 'id', ); // Tellimuse olek: // 1 – Järjekorras, 2 – Ootel, 3 - Töös, 4 – Lõpetatud, // 5 – Tagasi lükatud, 6 – Tühistatud. const orderStatus = 4; const orderNumber = 'TSU000001200'; return ` ${getPais(USER, RECIPIENT, orderCreatedAt, orderId, "AL")} ${orderId} ${getClientInstitution({ index: 1 })} ${getProviderInstitution({ index: 1 })} ${getClientPerson(person)} Siia tuleb tellija poolne märkus ${getPatient(person)} 1.3.6.1.4.1.28284.1.625.2.17 16522314 1.3.6.1.4.1.28284.6.2.1.244.8 119297000 Veri 16522314 1 2022-08-19 08:53:00 2022-08-23 15:10:00 ${orderNumber} ${orderStatus} ${analysisGroups.map((group) => { let relatedAnalysisElement = analysisElements?.find( (element) => element.analysis_groups.id === group.id, ); const relatedAnalyses = analyses?.filter((analysis) => { return analysis.analysis_elements.analysis_groups.id === group.id; }); if (!relatedAnalysisElement) { relatedAnalysisElement = relatedAnalyses?.find( (relatedAnalysis) => relatedAnalysis.analysis_elements.analysis_groups.id === group.id, )?.analysis_elements; } if (!relatedAnalysisElement || !relatedAnalysisElement.material_groups) { throw new Error( `Failed to find related analysis element for group ${group.name} (id: ${group.id})`, ); } const lower = getRandomInt(0, 100); const upper = getRandomInt(lower + 1, 500); const result = getRandomInt(lower, upper); return (` ${group.original_id} ${group.name} ${relatedAnalysisElement.analysis_id_oid} ${relatedAnalysisElement.analysis_id_original} ${relatedAnalysisElement.tehik_short_loinc} ${relatedAnalysisElement.tehik_loinc_name} ${relatedAnalysisElement.analysis_name_lab ?? relatedAnalysisElement.tehik_loinc_name} ${relatedAnalysisElement.id} ${relatedAnalysisElement.id} 4 % ${result} ${formatDate(new Date(), 'yyyy-MM-dd HH:mm:ss')} ${upper} ${lower} 0 1 2 `); }).join('')} `; }