Project: worktrees-master · Branch: master · Mode: · Model: claude-haiku-4-5-20251001 Stats: 1 user messages, 32 tool calls, tools used: Glob, Grep, Read, Bash. Conversation Turn 1 — User Search for existing implementations related to DMP document types, formats, and metadata. The task mentions: - Categories, Formats, Practices parameters - Document metadata structures - The hl_getInteropCodes command for fetching standardized code tables Find: 1. Are there existing type definitions for DMP documents? 2. Any existing implementations of document filters or search? 3. Constants for document types, formats, practice settings 4. Related enums or type definitions Provide file paths and examples of how document metadata is currently handled. Turn 1 — Assistant I'll search for existing implementations related to DMP document types, formats, and metadata. Let me start with a comprehensive search across the codebase. Tools used: - Glob: /dmp Tools used: - Grep: DMP|dmp Tools used: - Grep: document.type|DocumentType Tool results: → result (ok): Found 173 files packages/@doctolib/e_rezept/src/business/fhirConverter.test.ts packages/@doctolib/sharing-hub/src/components/SharingHubModal/SharingHubModal.test.tsx app/assets/javascripts/types/commons/window.ts packages/@doctolib/sick-notes-de-fulfillment/src/business/types/tpf/types.ts packages/@doctolib/sick-notes-de-fulfillment/src/business/tpf/mapEauPayloadToTpfRequest.test.ts packages/@doctolib/sick-notes-de-fulfillment/src/business/tpf/mapEauPayloadToTpfRequest.ts packages/@doctolib/pati …(truncated, 16438 more chars) Tool results: → result (ok): Found 30 files limit: 30, offset: 0 packages/@doctolib/financial_os_fr_billing/src/hooks/doctor/desktop/useAutoImportAmc.ts packages/@doctolib/e_rezept/src/business/fhirConverter.test.ts packages/@doctolib/doctor_appointment_booking_desktop_page/src/AppointmentPage/AppointmentModule/AppointmentContentModule/AppointmentBodyModule/DetailsTabModule/DetailsTabFooterModule/useDetailsTabFooterModuleController.ts packages/@doctolib/secure_messaging_core/src/services/fr/analyzeAttachmentsFr.ts packages/ …(truncated, 2656 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/models/processors/clone/documents/fr/dmp_document.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/activity_page/app/views/activity_page/statistics/segur_dmp.jbuilder /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/controllers/dmp/fr_dmp_documents_controller.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/dmp.gemspec /Users/USER/workspace/doctolib/doctolib/worktrees/ma …(truncated, 5908 more chars) Great! I found DMP-related files. Now let me search for document type constants, formats, and related metadata structures: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/types/FrDmpTypes.ts Tool results: → result (ok): 1→import type { MedicalFolder } from '@doctolib/ehr-core' 2→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3→import type { DmpDocumentToAdd, FrDmpDocument } from '../business/FrDmpConfig' 4→ 5→export interface FrDmpSessionStorage { 6→ sessionId: string 7→ practiceIndex: number 8→ healthcareSettings: string 9→ createdAt: Date 10→} 11→ 12→// DMP Requests 13→export interface DmpRequest { 14→ s_commandName: …(truncated, 8288 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConstants.ts Tool results: → result (ok): 1→export const FR_DMP_DOCUMENT_FORMAT = { 2→ jepg: 3, 3→ tiff: 4, 4→ pdf: 5, 5→ medicalSynthesis: 6, 6→} 7→ 8→export const STATUS_OK = 'OK' 9→ 10→export const SESSION_TIMEOUT_SECONDS = 4 60 60 11→ 12→export const DOCUMENT_VISIBILITY: Record = { 13→ sharedWithAll: 1, 14→ notSharedWithPatient: 2, 15→ notSharedWithPractitioner: 4, 16→ notSharedWithLegalRepresentative: 8, 17→ sharedOnlyWithPractition …(truncated, 1054 more chars) Tools used: - Grep: DocumentType|DocumentFormat|document.category|document.type Tool results: → result (ok): Found 50 files limit: 50, offset: 0 packages/@doctolib/financial_os_fr_billing/src/hooks/doctor/desktop/useAutoImportAmc.ts packages/@doctolib/e_rezept/src/business/fhirConverter.test.ts packages/@doctolib/doctor_appointment_booking_desktop_page/src/AppointmentPage/AppointmentModule/AppointmentContentModule/AppointmentBodyModule/DetailsTabModule/DetailsTabFooterModule/useDetailsTabFooterModuleController.ts packages/@doctolib/secure_messaging_core/src/services/fr/analyzeAttachmentsFr.ts packages/ …(truncated, 4721 more chars) Now let me search for more information about document categories, the hl_getInteropCodes command, and related filter/search implementations: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConfig.ts Tool results: → result (ok): 1→import type { MedicalFolder } from '@doctolib/ehr-core' 2→import { ConsultationDocumentKind } from 'monolith_DEPRECATED/types/doctor/api/ConsultationDocument' 3→import type { Document } from 'monolith_DEPRECATED/types/doctor/api/Document' 4→import type { DmpSharingOptionsInput } from '../hooks/DmpSharingService' 5→ 6→type DmpSharingOptions = DmpSharingOptionsInput & { 7→ dmpUniqueId?: string | undefined 8→} 9→ 10→export enum ItemType { 11→ Rich …(truncated, 1853 more chars) Tools used: - Grep: hl_getInteropCodes|interop.code|document.category|category.code Tools used: - Grep: Categories|Formats|Practices|Practice.Setting|HealthcareSettings Tool results: → result (ok): Found 40 files limit: 40, offset: 0 app/assets/javascripts/hooks/doctor/useOCR/predictDocumentCategory.ts packages/@doctolib/medical_history/src/components/LifestyleRiskFactors/LifestyleRiskFactorForm.tsx packages/@doctolib/financial_os_fr_billing/src/modules/doctor/mobile/BillStepsModule/views/DocumentCategoryField.tsx packages/@doctolib/ehr_prescriptions/src/components/PrescriptionForm/PrescriptionFormFr/treatment/AldsCoveredTreatment.tsx packages/@doctolib/ehr_prescriptions/src/components/Pre …(truncated, 4129 more chars) Tool results: → result (ok): Found 40 files limit: 40, offset: 0 packages/@doctolib/doctor_appointment_booking_mobile_page/src/MobileAppointmentPage/AppointmentIndexBody.tsx packages/@doctolib/doctor_appointment_booking_desktop_page/src/AppointmentPage/AppointmentModule/AppointmentContentModule/useAppointmentContentModuleController/useAppointmentContentModuleController.ts app/assets/javascripts/hooks/doctor/useOCR/useProcessOcrResultVariant.ts app/assets/javascripts/hooks/doctor/useOCR/predictDocumentCategory.ts app/assets/ …(truncated, 4457 more chars) Let me search for document filters, search implementations, and the hl_getInteropCodes command: Tools used: - Grep: document.filter|filter.search|search.document Tools used: - Bash: find /Users/USER/workspace/doctolib/doctolib/worktrees/master -type f -name ".ts" -o -name ".tsx" | xargs grep -l "hl_getInteropCodes" 2>/dev/null | head -20 Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/fr/dmp_document.rb Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→class Documents::Fr::DmpDocument < Documents::Db1Record 4→ data_taxonomy do 5→ description 'Not set by the table owner' 6→ default secret: false, 7→ system_id: false, 8→ health_information_likelihood: :none, 9→ data_subject_identity_likelihood: :none, 10→ data_subject_info_likelihood: :none, 11→ data_subjects: [:patient], 12→ sensitive_ …(truncated, 894 more chars) Tool results: → result (ok): Found 30 files limit: 30, offset: 0 engines/prescription_sharing/app/assets/javascripts/components/admin/debug_pages/AccessDebugSection.tsx app/assets/javascripts/components/doctor/desktop/pages/calendar/sidebar/index.tsx engines/check_in/app/assets/javascripts/modules/DocumentRequestFunnelContentModule/useDocumentRequestFunnelContentController.ts app/assets/javascripts/services/formatters/countries/configs/document-upload-kinds.ts packages/@doctolib/e_rezept/src/hooks/useSignERezeptAndDigaFromD …(truncated, 2912 more chars) Tool results: → result (ok) Let me search for the Ruby DMP implementations, API endpoints, and document models: Tools used: - Bash: find /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp -type f -name ".rb" | head -20 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/models/dmp/db1_record.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/policies/dmp/application_policy.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/public/dmp/api.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/jobs/dmp/application_job.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/controllers/dmp/application_c …(truncated, 715 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/controllers/dmp/fr_dmp_documents_controller.rb Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→class Dmp::FrDmpDocumentsController < Dmp::ApplicationController 4→ authenticate_with Authentication::Api::Filter::ACCOUNT 5→ before_action :set_fr_dmp_document 6→ after_action :verify_authorized 7→ 8→ def show 9→ return render json: {} unless @fr_dmp_document 10→ 11→ render json: { unique_id: @fr_dmp_document.unique_id, uuid: @fr_dmp_document.uuid, status: @fr_dmp_document.status } 12→ end 13 …(truncated, 933 more chars) Tools used: - Glob: /dmp//.rb Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/controllers/dmp/application_controller.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/controllers/dmp/fr_dmp_documents_controller.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/helpers/dmp/application_helper.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/jobs/dmp/application_job.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/ …(truncated, 2544 more chars) Now let me search for document API implementations and find any references to categories, formats, and practice settings: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/dmp/app/public/dmp/api.rb Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→module Dmp 4→ class Api 5→ class << self 6→ def dmp_enabled_for_account?(account, patient_base_id = nil) 7→ return false unless account 8→ 9→ fr_gp_subscription?(account) || 10→ (patient_base_id.present? && fr_gp_lvl3_authorization?(account, patient_base_id)) 11→ end 12→ 13→ private 14→ 15→ def fr_gp_subscription?(account) 16→ account.ehr_ …(truncated, 1189 more chars) Tools used: - Bash: find /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents -type f -name ".rb" | grep -E "(model|controller|api)" | head -15 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/document_filename.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/telehealth/document_kind.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/db4_record.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/renderer/variant.rb /Users/USER/workspace/doctolib/do …(truncated, 1297 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/fr/dmp_document.rb Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→class Documents::Fr::DmpDocument < Documents::Db1Record 4→ data_taxonomy do 5→ description 'Not set by the table owner' 6→ default secret: false, 7→ system_id: false, 8→ health_information_likelihood: :none, 9→ data_subject_identity_likelihood: :none, 10→ data_subject_info_likelihood: :none, 11→ data_subjects: [:patient], 12→ sensitive_ …(truncated, 894 more chars) Let me search for document search/filter implementations and document type enums: Tools used: - Bash: find /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents -type f -name ".rb" | head -20 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/document_filename.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/telehealth/document_kind.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/db4_record.rb /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/renderer/variant.rb /Users/USER/workspace/doctolib/do …(truncated, 1877 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/document.rb (1–100) Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→class Documents::Document < Documents::Db1Record 4→ include ActiveRecordCouchbaseRelations 5→ include SyncHelper 6→ include DataRetention::Retainable 7→ 8→ data_taxonomy do 9→ description 'Not set by the table owner' 10→ default secret: false, 11→ system_id: false, 12→ health_information_likelihood: :none, 13→ data_subject_identity_likelihood: :none, 14→ …(truncated, 4594 more chars) Tools used: - Bash: grep -r "DocumentKind\|DocumentFormat\|DocumentType\|DOCUMENT_" /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents --include=".rb" | head -30 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/telehealth/document_kind.rb:class Documents::Telehealth::DocumentKind /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/renderer/documents.rb: ENCRYPTED_DOCUMENT_FIELDS = %i[ /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/renderer/documents.rb: metadata.slice(ENCRYPTED_DOCUMENT_FIELDS), /Users/USER/ …(truncated, 6403 more chars) Let me check the DocumentKind enum and search for document category/format implementations: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/telehealth/document_kind.rb Tool results: → result (ok): 1→# frozen_string_literal: true 2→ 3→class Documents::Telehealth::DocumentKind 4→ TELEHEALTH_KINDS = [ 5→ Documents::Kind::MEDICAL_IMAGING_PRESCRIPTION, 6→ Documents::Kind::MEDICAL_IMAGING, 7→ Documents::Kind::BIOLOGICAL_PRESCRIPTION, 8→ Documents::Kind::MEDICINE_PRESCRIPTION, 9→ Documents::Kind::REPORT, 10→ Documents::Kind::TREATMENT_FORM, 11→ Documents::Kind::OTHER, 12→ Documents::Kind::MEDICAL_CERTIFICATE, 13→ …(truncated, 381 more chars) Tools used: - Bash: grep -r "practice_setting\|healthcare_setting\|PRACTICE\|HEALTHCARE" /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp --include=".ts" | head -20 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/types/FrDmpTypes.ts: practice_setting: string /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/types/FrDmpTypes.ts: healthcare_setting: string /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/DmpShare.test.ts: situation: { healthcare_setting: '', billing_identifier: '', practice_setting: '' }, /Users/USER/workspace/doctolib/doctol …(truncated, 305 more chars) Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/DmpShare.ts Tool results: → result (ok): 1→/ eslint-disable no-param-reassign / 2→/ eslint-disable @typescript-eslint/no-non-null-assertion / 3→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 4→import type { MedicalFolder } from '@doctolib/ehr-core' 5→import { blobToBase64 } from 'monolith_DEPRECATED/shared/BlobHelper' 6→import { getLoincCode, titlesByTypeAndKind } from 'monolith_DEPRECATED/models/document/document' 7→import { isMinor } from 'monolith_DEPRECATED/models/patie …(truncated, 22537 more chars) Perfect! Now let me read the FrDmpHelpers to see how document formats are handled: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/helpers/FrDmpHelpers.ts Tool results: → result (ok): 1→import type { EhrFrSharingSettings } from 'monolith_DEPRECATED/types/doctor/api/EhrFrSharingSettings' 2→import { isMedicalSynthesis } from 'monolith_DEPRECATED/components/doctor/desktop/pages/patient/patient-file-tabs/consultation/ConsultationDocumentForm/MedicalSynthesis/MedicalSynthesisHelper' 3→import HttpClient from 'monolith_DEPRECATED/services/http-client/doctor/desktop/httpClient' 4→import { isDdvVersionEqualOrAfter } from '@doctolib/desktop/versions' 5→import type { …(truncated, 5064 more chars) Tools used: - Bash: grep -r "Categories\|document.category\|category.list" /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp --include=".ts" | head -15 Tool results: → result (ok) Now let me search for the Loinccode mapping and document category implementations: Tools used: - Bash: grep -r "getLoincCode\|titlesByTypeAndKind\|LOINC" /Users/USER/workspace/doctolib/doctolib/worktrees/master --include=".ts" | head -20 Tools used: - Bash: find /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts -type f -name ".ts" | xargs grep -l "getLoincCode\|titlesByTypeAndKind" 2>/dev/null | head -5 Tools used: - Bash: grep -r "export.getLoincCode\|const.getLoincCode\|function.getLoincCode" /Users/USER/workspace/doctolib/doctolib/worktrees/master --include=".ts" -A 5 | head -40 Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.ts /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/components/doctor/desktop/pages/patient/patient-file-tabs/consultation/PatientCheckout/FileSharing/generate/index.ts Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts: getLoincCode, /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts:describe('getLoincCode', () => { /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts: expect(getLoincCode('prescription', 'prescription')).toEqual('57833-6') /Users/USER/workspace/doctolib/docto …(truncated, 3160 more chars) Tool results: → result (ok): /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts: const documentCategory = getLoincCode('other', documentKind[1]) /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts- expect(documentCategory).not.toBeUndefined() /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.test.ts- expect(documentCategory).not.toBeN …(truncated, 4333 more chars) Excellent! Now let me read the full document.ts file to see the LOINC code mapping: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.ts (1–200) Tool results: → result (ok): 1→import { v4 as uuidv4 } from 'uuid' 2→import { countBy, isEmpty, keys, orderBy, partition, pick, uniq, uniqBy, values } from 'lodash-es' 3→import constants from 'services/constants' 4→import i18n from 'services/i18n' 5→import type { 6→ DocumentIcon, 7→ DocumentKind, 8→ DocumentKindColor, 9→} from 'engines/documents/components/shared/DocumentKindDetails' 10→import { DOCUMENT_KINDS, isDocumentKindKey } from 'engines/documents/components/shared/Docum …(truncated, 9901 more chars) Perfect! Now let me search for the FrDmpCommunication to find sendDocument and understand how document category is used: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts (1–150) Tool results: → result (ok): 1→import { sendMonitoringEvent } from 'monolith_DEPRECATED/services/monitoring' 2→import { startPerformanceTracking } from 'monolith_DEPRECATED/services/performance/PerformanceTrackingService' 3→import { envIsProduction } from 'monolith_DEPRECATED/packages/device/environment' 4→import { isFeatureEnabled } from '@doctolib/variation_management' 5→import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 6→import dayjs from 'dayjs' 7→import type { …(truncated, 5596 more chars) Let me continue reading the FrDmpCommunication file to see the sendDocument function: Tools used: - Read: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts (150–300) Tool results: → result (ok): 150→ frDmpSend({ 151→ s_commandName: 'hl_getSessionState', 152→ s_sessionId: sessionId, 153→ }) 154→ 155→export const readCpxCard = (sessionId: string, pin: string): Promise => 156→ frDmpSend({ 157→ s_commandName: 'hl_readCpxCard', 158→ s_sessionId: sessionId, 159→ s_pinCode: pin, 160→ }) 161→ 162→export const openSession = async (): Prom …(truncated, 6459 more chars) Perfect! Now I have a comprehensive understanding. Let me create a final summary report with all the findings: Summary of DMP Document Types, Formats, and Metadata Implementation I've completed a comprehensive search of the codebase for DMP document type definitions, formats, and metadata handling. Here are my findings: 1. Document Format Constants File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConstants.ts export const FR_DMP_DOCUMENT_FORMAT = { jepg: 3, tiff: 4, pdf: 5, medicalSynthesis: 6, } 2. Document Type Definitions File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConfig.ts export enum ItemType { RichText = 'rich_text', PaperForm = 'paper_form', MedicationRequest = 'medication_request', ServicePrescription = 'service_prescription', ConsultationDocument = 'consultation_document', UploadedDocument = 'uploaded_document', ImportedDocument = 'imported_document', } 3. Document Category (LOINC Codes) File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.ts DOCUMENT_KIND_TO_LOINC_CODE mapping - Document kinds map to LOINC (Logical Observation Identifiers Names and Codes) for DMP transmission: export const DOCUMENT_KIND_TO_LOINC_CODE = Object.freeze({ medicine_prescription: '57833-6', medical_synthesis: 'SYNTH', biological_prescription: 'PRESC-BIO', paramedics_prescription: '57832-8', medical_imaging_prescription: '57828-6', biological_exam: 'PRESC-BIO', medical_imaging: '18748-4', referral: '18761-7', report: '11488-4', invoice: '52040-3', medical_certificate: 'CERT_DECL', // ... (48 total entries) }) File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.ts (lines 58-96) Consultation Attachment LOINC mapping - Separate mapping for different document attachment types: export const CONSULTATION_ATTACHMENT_KIND_TO_LOINC_CODE = Object.freeze({ letter: '11488-4', certificate: 'CERT_DECL', paramedical_care: '57832-8', biological_exam: 'PRESC-BIO', imaging_exam: '57828-6', prescription: '57833-6', medical_synthesis: 'SYNTH', // ... (19 total entries) }) 4. Document Format Handling File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/helpers/FrDmpHelpers.ts export const getDocumentFormat = ( item: DeprecatedDmpDocument | DmpDocumentItem | UploadedDmpDocumentItem, fileToUpload: Blob ): number | undefined => { if (isMedicalSynthesis(item.kind)) { return FR_DMP_DOCUMENT_FORMAT.medicalSynthesis // 6 } if (fileToUpload.type) { switch (fileToUpload.type) { case 'image/jpeg': return FR_DMP_DOCUMENT_FORMAT.jepg // 3 case 'image/tiff': return FR_DMP_DOCUMENT_FORMAT.tiff // 4 case 'application/pdf': return FR_DMP_DOCUMENT_FORMAT.pdf // 5 } } return undefined // Unsupported format } 5. Practice Settings & Healthcare Settings File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/types/FrDmpTypes.ts export interface BillingSituation { billing_identifier: string practice_setting: string // e.g., 'AMBULATOIRE' healthcare_setting: string // e.g., 'SA07' } In DMP Communication: - practice_setting is passed to createDmpConnector() and used in hl_createDmpConnector command - healthcare_setting defaults to 'SA07' if not provided in sendDocument() 6. Document Visibility/Sharing Settings File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConstants.ts export const DOCUMENT_VISIBILITY: Record = { sharedWithAll: 1, notSharedWithPatient: 2, notSharedWithPractitioner: 4, notSharedWithLegalRepresentative: 8, sharedOnlyWithPractitioner: 10, sharedOnlyWithPatient: 12, } 7. Send Document API Request Structure File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts (lines 232-299) Key parameters for document transmission: - s_commandName: 'hl_sendDocument' - s_documentCategory: LOINC code (from getLoincCode()) - i_documentFormat: Format code (3, 4, 5, or 6) - i_documentVisibility: Visibility code based on sharing settings and patient age - s_healthcareSetting: Healthcare setting code (defaults to 'SA07') - s_documentSetIdRoot: Fixed to '1.2.250.1.213.1.1.9' (OID for French DMP) - s_documentSetIdExtension: Document ID prefix (format: dl-{documentId}) 8. Type Definitions for DMP Documents File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/types/FrDmpTypes.ts export interface SendDocumentRequest extends DmpRequest { s_sessionId: string s_ins: string s_fileContentBase64: string s_documentTitle: string s_documentDescription: string i_documentVisibility: number s_documentCategory: string // LOINC code i_documentFormat: number // 3, 4, 5, or 6 s_replacedDocumentUniqueId: string s_healthcareSetting: string s_documentSetIdRoot: string s_documentSetIdExtension: string s_documentVersionNumber: string Identity: Identity } export type FrDmpDocument = { id: string unique_id: string uuid: string status?: 'OK' | 'ERROR' | 'cancelled' | 'deleted' insi_identity_status?: 'qualified' | 'validated' | 'fetched' | 'temporary' } 9. Model Definitions File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/engines/documents/app/models/documents/fr/dmp_document.rb class Documents::Fr::DmpDocument < Documents::Db1Record self.table_name = 'fr_dmp_documents' belongs_to :document, class_name: 'Documents::Document' # Stores: unique_id, uuid, status, insi_identity_status end 10. Error Handling Constants File: /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConstants.ts export const DMP_ERROR: Record = { cpsError: 'MissingCPSError', dmpClosed: 'DMPClosed', dmpNonExistent: 'DMPNonExistent', serverError: 'XDSRepositoryError', } export const CPS_MATCH_ERROR: Record = { noLocation: 'NoLocation', noSituationSelected: 'NoSituationSelected', noLocationMatch: 'NoLocationMatch', incompleteParametersOnCps: 'IncompleteParametersOnCps', } 11. DMP Communication Flow The DMP system uses these commands (called via hl_ prefixed WebSocket commands): - hl_openSession - Establish DMP session - hl_getPcscReaders - Get available card readers - hl_readCpxCard - Read professional card - hl_createDmpConnector - Create DMP connector with practice setting - hl_sendDocument - Send document with category (LOINC), format, and healthcare settings - hl_deleteDocument - Delete document - hl_getMajorityAge - Verify patient age - hl_setConfidentialityLevel - Set mode - hl_getAuthentificationDmpStatusForPatient - Check patient DMP status Key Files for Reference: 1. /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpConstants.ts - Format and visibility constants 2. /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/helpers/FrDmpHelpers.ts - Format detection logic 3. /Users/USER/workspace/doctolib/doctolib/worktrees/master/packages/@doctolib/dmp/src/business/FrDmpCommunication.ts - Document sending logic 4. /Users/USER/workspace/doctolib/doctolib/worktrees/master/app/assets/javascripts/models/document/document.ts - LOINC code mappings 5. `/Users/USE …(truncated, 113 more chars)