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
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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>`;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user