diff --git a/app/api/job/handler/sync-analysis-groups.ts b/app/api/job/handler/sync-analysis-groups.ts index c9bd2e0..59703fc 100644 --- a/app/api/job/handler/sync-analysis-groups.ts +++ b/app/api/job/handler/sync-analysis-groups.ts @@ -3,9 +3,9 @@ import { XMLParser } from 'fast-xml-parser'; import fs from 'fs'; import { createAnalysisGroup, getAnalysisGroups } from '~/lib/services/analysis-group.service'; import { IMedipostPublicMessageDataParsed } from '~/lib/services/medipost/medipost.types'; -import { createAnalysis, createNoDataReceivedEntry, createNoNewDataReceivedEntry, createSyncFailEntry, createSyncSuccessEntry } from '~/lib/services/analyses.service'; +import { createAnalysis, createNoDataReceivedEntry, createNoNewDataReceivedEntry, createSyncFailEntry, createSyncSuccessEntry, getAnalyses } from '~/lib/services/analyses.service'; import { getLastCheckedDate } from '~/lib/services/sync-entries.service'; -import { createAnalysisElement } from '~/lib/services/analysis-element.service'; +import { AnalysisElement, createAnalysisElement, getAnalysisElements } from '~/lib/services/analysis-element.service'; import { createCodes } from '~/lib/services/codes.service'; import { getLatestPublicMessageListItem } from '~/lib/services/medipost/medipostPublicMessage.service'; import type { ICode } from '~/lib/types/code'; @@ -82,42 +82,60 @@ export default async function syncAnalysisGroups() { const codes: ICode[] = []; for (const analysisGroup of analysisGroups) { const existingAnalysisGroup = existingAnalysisGroups?.find(({ original_id }) => original_id === analysisGroup.UuringuGruppId); + let groupExistingAnalysisElements: AnalysisElement[] = []; + let analysisGroupId: number; if (existingAnalysisGroup) { - console.info(`Analysis group '${analysisGroup.UuringuGruppNimi}' already exists`); - continue; + console.info(`Analysis group '${analysisGroup.UuringuGruppNimi}' already exists, only creating new analysis elements`); + groupExistingAnalysisElements = await getAnalysisElements({ analysisGroupId: existingAnalysisGroup.id }); + analysisGroupId = existingAnalysisGroup.id; + } else { + analysisGroupId = await createAnalysisGroup({ + id: analysisGroup.UuringuGruppId, + name: analysisGroup.UuringuGruppNimi, + order: analysisGroup.UuringuGruppJarjekord, + }); + + const analysisGroupCodes = toArray(analysisGroup.Kood); + codes.push( + ...analysisGroupCodes.map((kood) => ({ + hk_code: kood.HkKood, + hk_code_multiplier: kood.HkKoodiKordaja, + coefficient: kood.Koefitsient, + price: kood.Hind, + analysis_group_id: analysisGroupId, + analysis_element_id: null, + analysis_id: null, + })), + ); } - // SAVE ANALYSIS GROUP - const analysisGroupId = await createAnalysisGroup({ - id: analysisGroup.UuringuGruppId, - name: analysisGroup.UuringuGruppNimi, - order: analysisGroup.UuringuGruppJarjekord, - }); - - const analysisGroupCodes = toArray(analysisGroup.Kood); - codes.push( - ...analysisGroupCodes.map((kood) => ({ - hk_code: kood.HkKood, - hk_code_multiplier: kood.HkKoodiKordaja, - coefficient: kood.Koefitsient, - price: kood.Hind, - analysis_group_id: analysisGroupId, - analysis_element_id: null, - analysis_id: null, - })), - ); - const analysisGroupItems = toArray(analysisGroup.Uuring); for (const item of analysisGroupItems) { - const analysisElement = item.UuringuElement; + const analysisElement = item.UuringuElement!; + const isExistingAnalysisElement = groupExistingAnalysisElements + .find(({ analysis_id_original }) => analysis_id_original === analysisElement.UuringId); + if (isExistingAnalysisElement) { + console.info(`Analysis element '${analysisElement.UuringNimi}' already exists`); + continue; + } const insertedAnalysisElementId = await createAnalysisElement({ - analysisElement, + analysisElement: analysisElement!, analysisGroupId, materialGroups: toArray(item.MaterjalideGrupp), }); + if (Array.isArray(analysisElement.UuringuElement)) { + for (const nestedAnalysisElement of analysisElement.UuringuElement) { + await createAnalysisElement({ + analysisElement: nestedAnalysisElement, + analysisGroupId, + materialGroups: toArray(item.MaterjalideGrupp), + }); + } + } + if (analysisElement.Kood) { const analysisElementCodes = toArray(analysisElement.Kood); codes.push( @@ -135,7 +153,15 @@ export default async function syncAnalysisGroups() { const analyses = analysisElement.UuringuElement; if (analyses?.length) { + const existingAnalyses = await getAnalyses({ originalIds: analyses.map(({ UuringId }) => UuringId) }); + for (const analysis of analyses) { + const isExistingAnalysis = existingAnalyses.find(({ analysis_id_original }) => analysis_id_original === analysis.UuringId); + if (isExistingAnalysis) { + console.info(`Analysis '${analysis.UuringNimi}' already exists`); + continue; + } + const insertedAnalysisId = await createAnalysis(analysis, analysisGroupId); if (analysis.Kood) {