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

View File

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