emr-types
Version:
Comprehensive TypeScript Types Library for Electronic Medical Record (EMR) Applications - Domain-Driven Design with Zod Validation
425 lines • 12.9 kB
TypeScript
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