Merge pull request #93 from MR-medreport/analysis-xml-fix-1109

fix sending multiple analysis elements for same material group with different <Proov> data
This commit is contained in:
2025-09-12 10:55:04 +00:00
committed by GitHub
2 changed files with 61 additions and 61 deletions

View File

@@ -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);
}

View File

@@ -151,14 +151,21 @@ export const getAnalysisElement = (
export const getAnalysisGroup = (
analysisGroupOriginalId: string,
analysisGroupName: string,
specimenOrderNr: number,
analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>,
) =>
`<UuringuGrupp>
<UuringuGruppId>${analysisGroupOriginalId}</UuringuGruppId>
<UuringuGruppNimi>${analysisGroupName}</UuringuGruppNimi>
<Uuring>
uuringElementInputs: {
analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>,
specimenOrderNr: number,
}[],
) => {
const uuringElements = uuringElementInputs.map(({ analysisElement, specimenOrderNr }) =>
`<Uuring>
${getAnalysisElement(analysisElement.analysis_id_oid, analysisElement.analysis_id_original, analysisElement.tehik_short_loinc, analysisElement.tehik_loinc_name, analysisElement.id, analysisElement.analysis_name_lab)}
<ProoviJarjenumber>${specimenOrderNr}</ProoviJarjenumber>
</Uuring>
</Uuring>`
).join('');
return `<UuringuGrupp>
<UuringuGruppId>${analysisGroupOriginalId}</UuringuGruppId>
<UuringuGruppNimi>${analysisGroupName}</UuringuGruppNimi>
${uuringElements}
</UuringuGrupp>`;
};