diff --git a/lib/services/medipostXML.service.ts b/lib/services/medipostXML.service.ts index 2b457d5..77e00eb 100644 --- a/lib/services/medipostXML.service.ts +++ b/lib/services/medipostXML.service.ts @@ -76,42 +76,34 @@ export async function composeOrderXML({ // Collect all materials from all analysis groups for (const currentGroup of analysisGroups) { - let relatedAnalysisElement = analysisElements?.find( - (element) => element.analysis_groups.id === currentGroup.id, - ); - const relatedAnalyses = analyses?.filter((analysis) => { - return analysis.analysis_elements.analysis_groups.id === currentGroup.id; - }); + let relatedAnalysisElements = analysisElements?.filter(({ analysis_groups }) => analysis_groups.id === currentGroup.id); - if (!relatedAnalysisElement) { - relatedAnalysisElement = relatedAnalyses?.find( - (relatedAnalysis) => - relatedAnalysis.analysis_elements.analysis_groups.id === - currentGroup.id, - )?.analysis_elements; + if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) { + relatedAnalysisElements = analyses + .filter(({ analysis_elements }) => analysis_elements.analysis_groups.id === currentGroup.id) + .flatMap(({ analysis_elements }) => analysis_elements); } - if (!relatedAnalysisElement || !relatedAnalysisElement.material_groups) { + if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) { throw new Error( - `Failed to find related analysis element for group ${currentGroup.name} (id: ${currentGroup.id})`, + `Failed to find related analysis elements for group ${currentGroup.name} (id: ${currentGroup.id})`, ); } - for (const group of relatedAnalysisElement?.material_groups as MaterjalideGrupp[]) { - const materials = toArray(group.Materjal); - for (const material of materials) { - const { MaterjaliNimi, MaterjaliTyyp, MaterjaliTyypOID, Konteiner } = material; - const containers = toArray(Konteiner); - - for (const container of containers) { - // Use MaterialTyyp as the key for deduplication - const materialKey = MaterjaliTyyp; - - if (!uniqueMaterials.has(materialKey)) { - uniqueMaterials.set(materialKey, { - MaterjaliTyypOID, - MaterjaliTyyp, - MaterjaliNimi, + for (const analysisElement of relatedAnalysisElements) { + for (const { Materjal } of analysisElement.material_groups as MaterjalideGrupp[]) { + for (const material of toArray(Materjal)) { + const { MaterjaliTyyp } = material; + + for (const container of toArray(material.Konteiner)) { + if (uniqueMaterials.has(MaterjaliTyyp)) { + continue; + } + + uniqueMaterials.set(MaterjaliTyyp, { + MaterjaliTyypOID: material.MaterjaliTyypOID, + MaterjaliTyyp: material.MaterjaliTyyp, + MaterjaliNimi: material.MaterjaliNimi, ProovinouKoodOID: container.ProovinouKoodOID, ProovinouKood: container.ProovinouKood, order: specimenOrder++, @@ -137,47 +129,48 @@ export async function composeOrderXML({ // Generate analysis section with correct specimen references const analysisSection = []; for (const currentGroup of analysisGroups) { - let relatedAnalysisElement = analysisElements?.find( + let relatedAnalysisElements = analysisElements?.filter( (element) => element.analysis_groups.id === currentGroup.id, ); - const relatedAnalyses = analyses?.filter((analysis) => { - return analysis.analysis_elements.analysis_groups.id === currentGroup.id; - }); - if (!relatedAnalysisElement) { - relatedAnalysisElement = relatedAnalyses?.find( - (relatedAnalysis) => - relatedAnalysis.analysis_elements.analysis_groups.id === - currentGroup.id, - )?.analysis_elements; + if (!relatedAnalysisElements) { + relatedAnalysisElements = analyses + .filter(({ analysis_elements }) => analysis_elements.analysis_groups.id === currentGroup.id) + .flatMap(({ analysis_elements }) => analysis_elements); } - if (!relatedAnalysisElement || !relatedAnalysisElement.material_groups) { + if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) { throw new Error( `Failed to find related analysis element for group ${currentGroup.name} (id: ${currentGroup.id})`, ); } - // Find the specimen order number for this analysis group - let specimenOrderNumber = 1; - for (const group of relatedAnalysisElement?.material_groups as MaterjalideGrupp[]) { - const materials = toArray(group.Materjal); - for (const material of materials) { - const materialKey = material.MaterjaliTyyp; - const uniqueMaterial = uniqueMaterials.get(materialKey); - if (uniqueMaterial) { - specimenOrderNumber = uniqueMaterial.order; - break; // Use the first material's order number + // Find the specimen order numbers for analysis elements + const uuringElementInputs: { + analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>, + specimenOrderNr: number, + }[] = []; + for (const analysisElement of relatedAnalysisElements) { + for (const group of analysisElement.material_groups as MaterjalideGrupp[]) { + const materials = toArray(group.Materjal); + for (const material of materials) { + const uniqueMaterial = uniqueMaterials.get(material.MaterjaliTyyp); + if (!uniqueMaterial) { + continue; + } + uuringElementInputs.push({ + analysisElement, + specimenOrderNr: uniqueMaterial.order, + }); + break; } } - if (specimenOrderNumber > 1) break; // Found a specimen, use it } const groupXml = getAnalysisGroup( currentGroup.original_id, currentGroup.name, - specimenOrderNumber, - relatedAnalysisElement, + uuringElementInputs, ); analysisSection.push(groupXml); } diff --git a/lib/templates/medipost-order.ts b/lib/templates/medipost-order.ts index f6da882..9ca1f55 100644 --- a/lib/templates/medipost-order.ts +++ b/lib/templates/medipost-order.ts @@ -151,14 +151,21 @@ export const getAnalysisElement = ( export const getAnalysisGroup = ( analysisGroupOriginalId: string, analysisGroupName: string, - specimenOrderNr: number, - analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>, -) => - ` - ${analysisGroupOriginalId} - ${analysisGroupName} - + uuringElementInputs: { + analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>, + specimenOrderNr: number, + }[], +) => { + const uuringElements = uuringElementInputs.map(({ analysisElement, specimenOrderNr }) => + ` ${getAnalysisElement(analysisElement.analysis_id_oid, analysisElement.analysis_id_original, analysisElement.tehik_short_loinc, analysisElement.tehik_loinc_name, analysisElement.id, analysisElement.analysis_name_lab)} ${specimenOrderNr} - + ` + ).join(''); + + return ` + ${analysisGroupOriginalId} + ${analysisGroupName} + ${uuringElements} `; +};