UNPKG

emr-types

Version:

Comprehensive TypeScript Types Library for Electronic Medical Record (EMR) Applications - Domain-Driven Design with Zod Validation

425 lines 12.9 kB
import { BaseDomainEvent } from '../../shared/events/BaseDomainEvent'; import { PatientId } from '../value-objects/PatientId'; import { TenantId } from '../../tenant/value-objects/TenantId'; import { UserId } from '../../user/value-objects/UserId'; import { Patient } from '../entities/Patient'; import { PatientStatus } from '../enums/PatientStatus'; /** * Base interface for all patient domain events */ export interface PatientDomainEvent extends BaseDomainEvent { patientId: PatientId; tenantId: TenantId; } /** * Event fired when a new patient is registered */ export interface PatientRegisteredEvent extends PatientDomainEvent { eventType: 'PatientRegistered'; data: { patient: Patient; registeredBy: UserId; registrationMethod: 'online' | 'in_person' | 'phone' | 'referral'; source?: string; }; } /** * Event fired when a patient's information is updated */ export interface PatientUpdatedEvent extends PatientDomainEvent { eventType: 'PatientUpdated'; data: { patient: Patient; updatedBy: UserId; changes: { field: string; oldValue: unknown; newValue: unknown; }[]; updateReason?: string; }; } /** * Event fired when a patient's status changes */ export interface PatientStatusChangedEvent extends PatientDomainEvent { eventType: 'PatientStatusChanged'; data: { patient: Patient; oldStatus: PatientStatus; newStatus: PatientStatus; changedBy: UserId; reason?: string; effectiveDate: Date; }; } /** * Event fired when a patient is assigned to a doctor */ export interface PatientAssignedToDoctorEvent extends PatientDomainEvent { eventType: 'PatientAssignedToDoctor'; data: { patient: Patient; doctorId: UserId; assignedBy: UserId; assignmentDate: Date; reason?: string; previousDoctorId?: UserId; }; } /** * Event fired when a patient is discharged */ export interface PatientDischargedEvent extends PatientDomainEvent { eventType: 'PatientDischarged'; data: { patient: Patient; dischargedBy: UserId; dischargeDate: Date; dischargeReason: string; dischargeSummary?: string; followUpInstructions?: string; followUpDate?: Date; }; } /** * Event fired when a patient is transferred to another facility */ export interface PatientTransferredEvent extends PatientDomainEvent { eventType: 'PatientTransferred'; data: { patient: Patient; transferredBy: UserId; transferDate: Date; destinationFacility: string; transferReason: string; transferNotes?: string; contactInformation?: { facilityName: string; contactPerson: string; phoneNumber: string; email?: string; }; }; } /** * Event fired when a patient's medical history is updated */ export interface PatientMedicalHistoryUpdatedEvent extends PatientDomainEvent { eventType: 'PatientMedicalHistoryUpdated'; data: { patient: Patient; updatedBy: UserId; updateType: 'allergy_added' | 'allergy_removed' | 'medication_added' | 'medication_removed' | 'condition_added' | 'condition_updated'; medicalRecordId: string; changes: { field: string; oldValue?: unknown; newValue: unknown; }[]; notes?: string; }; } /** * Event fired when a patient's insurance information is updated */ export interface PatientInsuranceUpdatedEvent extends PatientDomainEvent { eventType: 'PatientInsuranceUpdated'; data: { patient: Patient; updatedBy: UserId; insuranceType: 'primary' | 'secondary'; oldInsurance?: { providerName: string; policyNumber: string; }; newInsurance: { providerName: string; policyNumber: string; effectiveDate: Date; }; reason?: string; }; } /** * Event fired when a patient's billing information is updated */ export interface PatientBillingUpdatedEvent extends PatientDomainEvent { eventType: 'PatientBillingUpdated'; data: { patient: Patient; updatedBy: UserId; billingChanges: { field: string; oldValue?: unknown; newValue: unknown; }[]; paymentMethodUpdated?: boolean; outstandingBalanceChanged?: boolean; reason?: string; }; } /** * Event fired when a patient's privacy settings are updated */ export interface PatientPrivacySettingsUpdatedEvent extends PatientDomainEvent { eventType: 'PatientPrivacySettingsUpdated'; data: { patient: Patient; updatedBy: UserId; settingChanges: { setting: string; oldValue: boolean; newValue: boolean; }[]; reason?: string; complianceNotes?: string; }; } /** * Event fired when a patient's consent is recorded */ export interface PatientConsentRecordedEvent extends PatientDomainEvent { eventType: 'PatientConsentRecorded'; data: { patient: Patient; recordedBy: UserId; consentType: string; procedureName: string; consentDate: Date; expiresDate?: Date; signedBy: string; witnessName?: string; consentFormId?: string; notes?: string; }; } /** * Event fired when a patient's preferences are updated */ export interface PatientPreferencesUpdatedEvent extends PatientDomainEvent { eventType: 'PatientPreferencesUpdated'; data: { patient: Patient; updatedBy: UserId; preferenceChanges: { category: string; field: string; oldValue?: unknown; newValue: unknown; }[]; reason?: string; }; } /** * Event fired when a patient's emergency contact is updated */ export interface PatientEmergencyContactUpdatedEvent extends PatientDomainEvent { eventType: 'PatientEmergencyContactUpdated'; data: { patient: Patient; updatedBy: UserId; contactChanges: { contactType: 'primary' | 'secondary'; oldContact?: { name: string; relationship: string; phoneNumber: string; }; newContact: { name: string; relationship: string; phoneNumber: string; email?: string; address?: string; }; }[]; reason?: string; }; } /** * Event fired when a patient's vital signs are recorded */ export interface PatientVitalSignsRecordedEvent extends PatientDomainEvent { eventType: 'PatientVitalSignsRecorded'; data: { patient: Patient; recordedBy: UserId; vitalSigns: { temperature?: number; bloodPressure?: { systolic: number; diastolic: number; }; heartRate?: number; respiratoryRate?: number; oxygenSaturation?: number; height?: number; weight?: number; bmi?: number; }; recordingDate: Date; location?: string; notes?: string; }; } /** * Event fired when a patient's medication is prescribed */ export interface PatientMedicationPrescribedEvent extends PatientDomainEvent { eventType: 'PatientMedicationPrescribed'; data: { patient: Patient; prescribedBy: UserId; medication: { name: string; dosage: string; frequency: string; startDate: Date; endDate?: Date; instructions?: string; }; prescriptionId: string; pharmacy?: string; notes?: string; }; } /** * Event fired when a patient's medication is discontinued */ export interface PatientMedicationDiscontinuedEvent extends PatientDomainEvent { eventType: 'PatientMedicationDiscontinued'; data: { patient: Patient; discontinuedBy: UserId; medication: { name: string; originalPrescriptionId: string; }; discontinuationDate: Date; reason: string; notes?: string; }; } /** * Event fired when a patient's allergy is recorded */ export interface PatientAllergyRecordedEvent extends PatientDomainEvent { eventType: 'PatientAllergyRecorded'; data: { patient: Patient; recordedBy: UserId; allergy: { allergen: string; severity: string; reaction: string; onsetDate?: Date; }; allergyId: string; notes?: string; }; } /** * Event fired when a patient's immunization is recorded */ export interface PatientImmunizationRecordedEvent extends PatientDomainEvent { eventType: 'PatientImmunizationRecorded'; data: { patient: Patient; recordedBy: UserId; immunization: { vaccineName: string; administrationDate: Date; nextDueDate?: Date; lotNumber?: string; }; immunizationId: string; location: string; notes?: string; }; } /** * Event fired when a patient's lab result is recorded */ export interface PatientLabResultRecordedEvent extends PatientDomainEvent { eventType: 'PatientLabResultRecorded'; data: { patient: Patient; recordedBy: UserId; labResult: { testName: string; testDate: Date; result: string; normalRange?: string; units?: string; isAbnormal: boolean; }; labResultId: string; lab: string; orderingPhysician: string; notes?: string; }; } /** * Event fired when a patient's imaging result is recorded */ export interface PatientImagingResultRecordedEvent extends PatientDomainEvent { eventType: 'PatientImagingResultRecorded'; data: { patient: Patient; recordedBy: UserId; imagingResult: { imagingType: string; studyDate: Date; report: string; isAbnormal: boolean; followUpRequired: boolean; }; imagingResultId: string; facility: string; radiologist: string; notes?: string; }; } /** * Union type for all patient domain events */ export type PatientEvent = PatientRegisteredEvent | PatientUpdatedEvent | PatientStatusChangedEvent | PatientAssignedToDoctorEvent | PatientDischargedEvent | PatientTransferredEvent | PatientMedicalHistoryUpdatedEvent | PatientInsuranceUpdatedEvent | PatientBillingUpdatedEvent | PatientPrivacySettingsUpdatedEvent | PatientConsentRecordedEvent | PatientPreferencesUpdatedEvent | PatientEmergencyContactUpdatedEvent | PatientVitalSignsRecordedEvent | PatientMedicationPrescribedEvent | PatientMedicationDiscontinuedEvent | PatientAllergyRecordedEvent | PatientImmunizationRecordedEvent | PatientLabResultRecordedEvent | PatientImagingResultRecordedEvent; /** * Factory functions for creating patient domain events */ export declare const PatientEventFactory: { /** * Create a PatientRegisteredEvent */ createPatientRegisteredEvent(patient: Patient, registeredBy: UserId, registrationMethod: "online" | "in_person" | "phone" | "referral", source?: string): PatientRegisteredEvent; /** * Create a PatientUpdatedEvent */ createPatientUpdatedEvent(patient: Patient, updatedBy: UserId, changes: { field: string; oldValue: unknown; newValue: unknown; }[], updateReason?: string): PatientUpdatedEvent; /** * Create a PatientStatusChangedEvent */ createPatientStatusChangedEvent(patient: Patient, oldStatus: PatientStatus, newStatus: PatientStatus, changedBy: UserId, reason?: string): PatientStatusChangedEvent; }; /** * Type guard to check if an event is a PatientRegisteredEvent */ export declare function isPatientRegisteredEvent(event: PatientEvent): event is PatientRegisteredEvent; /** * Type guard to check if an event is a PatientUpdatedEvent */ export declare function isPatientUpdatedEvent(event: PatientEvent): event is PatientUpdatedEvent; /** * Type guard to check if an event is a PatientStatusChangedEvent */ export declare function isPatientStatusChangedEvent(event: PatientEvent): event is PatientStatusChangedEvent; /** * Type guard to check if an event is a PatientDomainEvent */ export declare function isPatientDomainEvent(event: unknown): event is PatientDomainEvent; //# sourceMappingURL=PatientDomainEvent.d.ts.map