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:
@@ -76,42 +76,34 @@ export async function composeOrderXML({
|
|||||||
|
|
||||||
// Collect all materials from all analysis groups
|
// Collect all materials from all analysis groups
|
||||||
for (const currentGroup of analysisGroups) {
|
for (const currentGroup of analysisGroups) {
|
||||||
let relatedAnalysisElement = analysisElements?.find(
|
let relatedAnalysisElements = analysisElements?.filter(({ analysis_groups }) => analysis_groups.id === currentGroup.id);
|
||||||
(element) => element.analysis_groups.id === currentGroup.id,
|
|
||||||
);
|
|
||||||
const relatedAnalyses = analyses?.filter((analysis) => {
|
|
||||||
return analysis.analysis_elements.analysis_groups.id === currentGroup.id;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!relatedAnalysisElement) {
|
if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) {
|
||||||
relatedAnalysisElement = relatedAnalyses?.find(
|
relatedAnalysisElements = analyses
|
||||||
(relatedAnalysis) =>
|
.filter(({ analysis_elements }) => analysis_elements.analysis_groups.id === currentGroup.id)
|
||||||
relatedAnalysis.analysis_elements.analysis_groups.id ===
|
.flatMap(({ analysis_elements }) => analysis_elements);
|
||||||
currentGroup.id,
|
|
||||||
)?.analysis_elements;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!relatedAnalysisElement || !relatedAnalysisElement.material_groups) {
|
if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) {
|
||||||
throw new Error(
|
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[]) {
|
for (const analysisElement of relatedAnalysisElements) {
|
||||||
const materials = toArray(group.Materjal);
|
for (const { Materjal } of analysisElement.material_groups as MaterjalideGrupp[]) {
|
||||||
for (const material of materials) {
|
for (const material of toArray(Materjal)) {
|
||||||
const { MaterjaliNimi, MaterjaliTyyp, MaterjaliTyypOID, Konteiner } = material;
|
const { MaterjaliTyyp } = material;
|
||||||
const containers = toArray(Konteiner);
|
|
||||||
|
for (const container of toArray(material.Konteiner)) {
|
||||||
for (const container of containers) {
|
if (uniqueMaterials.has(MaterjaliTyyp)) {
|
||||||
// Use MaterialTyyp as the key for deduplication
|
continue;
|
||||||
const materialKey = MaterjaliTyyp;
|
}
|
||||||
|
|
||||||
if (!uniqueMaterials.has(materialKey)) {
|
uniqueMaterials.set(MaterjaliTyyp, {
|
||||||
uniqueMaterials.set(materialKey, {
|
MaterjaliTyypOID: material.MaterjaliTyypOID,
|
||||||
MaterjaliTyypOID,
|
MaterjaliTyyp: material.MaterjaliTyyp,
|
||||||
MaterjaliTyyp,
|
MaterjaliNimi: material.MaterjaliNimi,
|
||||||
MaterjaliNimi,
|
|
||||||
ProovinouKoodOID: container.ProovinouKoodOID,
|
ProovinouKoodOID: container.ProovinouKoodOID,
|
||||||
ProovinouKood: container.ProovinouKood,
|
ProovinouKood: container.ProovinouKood,
|
||||||
order: specimenOrder++,
|
order: specimenOrder++,
|
||||||
@@ -137,47 +129,48 @@ export async function composeOrderXML({
|
|||||||
// Generate analysis section with correct specimen references
|
// Generate analysis section with correct specimen references
|
||||||
const analysisSection = [];
|
const analysisSection = [];
|
||||||
for (const currentGroup of analysisGroups) {
|
for (const currentGroup of analysisGroups) {
|
||||||
let relatedAnalysisElement = analysisElements?.find(
|
let relatedAnalysisElements = analysisElements?.filter(
|
||||||
(element) => element.analysis_groups.id === currentGroup.id,
|
(element) => element.analysis_groups.id === currentGroup.id,
|
||||||
);
|
);
|
||||||
const relatedAnalyses = analyses?.filter((analysis) => {
|
|
||||||
return analysis.analysis_elements.analysis_groups.id === currentGroup.id;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!relatedAnalysisElement) {
|
if (!relatedAnalysisElements) {
|
||||||
relatedAnalysisElement = relatedAnalyses?.find(
|
relatedAnalysisElements = analyses
|
||||||
(relatedAnalysis) =>
|
.filter(({ analysis_elements }) => analysis_elements.analysis_groups.id === currentGroup.id)
|
||||||
relatedAnalysis.analysis_elements.analysis_groups.id ===
|
.flatMap(({ analysis_elements }) => analysis_elements);
|
||||||
currentGroup.id,
|
|
||||||
)?.analysis_elements;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!relatedAnalysisElement || !relatedAnalysisElement.material_groups) {
|
if (!relatedAnalysisElements || relatedAnalysisElements.length === 0) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Failed to find related analysis element for group ${currentGroup.name} (id: ${currentGroup.id})`,
|
`Failed to find related analysis element for group ${currentGroup.name} (id: ${currentGroup.id})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the specimen order number for this analysis group
|
// Find the specimen order numbers for analysis elements
|
||||||
let specimenOrderNumber = 1;
|
const uuringElementInputs: {
|
||||||
for (const group of relatedAnalysisElement?.material_groups as MaterjalideGrupp[]) {
|
analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>,
|
||||||
const materials = toArray(group.Materjal);
|
specimenOrderNr: number,
|
||||||
for (const material of materials) {
|
}[] = [];
|
||||||
const materialKey = material.MaterjaliTyyp;
|
for (const analysisElement of relatedAnalysisElements) {
|
||||||
const uniqueMaterial = uniqueMaterials.get(materialKey);
|
for (const group of analysisElement.material_groups as MaterjalideGrupp[]) {
|
||||||
if (uniqueMaterial) {
|
const materials = toArray(group.Materjal);
|
||||||
specimenOrderNumber = uniqueMaterial.order;
|
for (const material of materials) {
|
||||||
break; // Use the first material's order number
|
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(
|
const groupXml = getAnalysisGroup(
|
||||||
currentGroup.original_id,
|
currentGroup.original_id,
|
||||||
currentGroup.name,
|
currentGroup.name,
|
||||||
specimenOrderNumber,
|
uuringElementInputs,
|
||||||
relatedAnalysisElement,
|
|
||||||
);
|
);
|
||||||
analysisSection.push(groupXml);
|
analysisSection.push(groupXml);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,14 +151,21 @@ export const getAnalysisElement = (
|
|||||||
export const getAnalysisGroup = (
|
export const getAnalysisGroup = (
|
||||||
analysisGroupOriginalId: string,
|
analysisGroupOriginalId: string,
|
||||||
analysisGroupName: string,
|
analysisGroupName: string,
|
||||||
specimenOrderNr: number,
|
uuringElementInputs: {
|
||||||
analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>,
|
analysisElement: Tables<{ schema: 'medreport' }, 'analysis_elements'>,
|
||||||
) =>
|
specimenOrderNr: number,
|
||||||
`<UuringuGrupp>
|
}[],
|
||||||
<UuringuGruppId>${analysisGroupOriginalId}</UuringuGruppId>
|
) => {
|
||||||
<UuringuGruppNimi>${analysisGroupName}</UuringuGruppNimi>
|
const uuringElements = uuringElementInputs.map(({ analysisElement, specimenOrderNr }) =>
|
||||||
<Uuring>
|
`<Uuring>
|
||||||
${getAnalysisElement(analysisElement.analysis_id_oid, analysisElement.analysis_id_original, analysisElement.tehik_short_loinc, analysisElement.tehik_loinc_name, analysisElement.id, analysisElement.analysis_name_lab)}
|
${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>
|
<ProoviJarjenumber>${specimenOrderNr}</ProoviJarjenumber>
|
||||||
</Uuring>
|
</Uuring>`
|
||||||
|
).join('');
|
||||||
|
|
||||||
|
return `<UuringuGrupp>
|
||||||
|
<UuringuGruppId>${analysisGroupOriginalId}</UuringuGruppId>
|
||||||
|
<UuringuGruppNimi>${analysisGroupName}</UuringuGruppNimi>
|
||||||
|
${uuringElements}
|
||||||
</UuringuGrupp>`;
|
</UuringuGrupp>`;
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user