Skip to content

Commit

Permalink
refactor: add observation when referring a patient
Browse files Browse the repository at this point in the history
- refactor re-usable components in composition

Signed-off-by: Kathurima Kimathi <kathurimakimathi415@gmail.com>
  • Loading branch information
KathurimaKimathi committed Mar 22, 2024
1 parent 8b4f9b9 commit 2cfb9a8
Show file tree
Hide file tree
Showing 11 changed files with 467 additions and 93 deletions.
7 changes: 5 additions & 2 deletions pkg/clinical/application/common/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,11 @@ const (
// LOINCExamination defines LOINC Examination note terminology code
LOINCExamination = "29545-1"

// LOINCPLANOFCARE defines LOINC Plan of care note terminology code
LOINCPLANOFCARE = "18776-5"
// LOINCPlanOfCare defines LOINC Plan of care note terminology code
LOINCPlanOfCare = "18776-5"

// LOINCReferralNote defines the referral code for patient referral under LOINC system
LOINCReferralNote = "57133-1"

// ColposcopyCIELTerminologyCode is the terminology code for colposcopy findings
ColposcopyCIELTerminologyCode = "162816"
Expand Down
1 change: 1 addition & 0 deletions pkg/clinical/application/dto/enums.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@ const (
FamilyHistory CompositionCategory = "FAMILY_HISTORY"
Examination CompositionCategory = "EXAMINATION"
PlanOfCare CompositionCategory = "PLAN_OF_CARE"
ReferralNote CompositionCategory = "REFERRAL_NOTE"
)

// Type enum represents type composition attribute
Expand Down
2 changes: 1 addition & 1 deletion pkg/clinical/presentation/graph/clinical.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -224,5 +224,5 @@ extend type Mutation {
getEncounterAssociatedResources(encounterID: String!): EncounterAssociatedResourceOutput!

# Referral
referPatient(input: ReferralInput!): ServiceRequest!
referPatient(input: ReferralInput!, count: Int): ServiceRequest!
}
4 changes: 2 additions & 2 deletions pkg/clinical/presentation/graph/clinical.resolvers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 21 additions & 15 deletions pkg/clinical/presentation/graph/generated/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

75 changes: 22 additions & 53 deletions pkg/clinical/usecases/clinical/composition.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,31 +54,12 @@ func (c *UseCasesClinicalImpl) CreateComposition(ctx context.Context, input dto.

id := uuid.New().String()

var compositionCategoryCode string

switch input.Category {
case "ASSESSMENT_PLAN":
compositionCategoryCode = common.LOINCAssessmentPlanCode
case "HISTORY_OF_PRESENTING_ILLNESS":
compositionCategoryCode = common.LOINCHistoryOfPresentingIllness
case "SOCIAL_HISTORY":
compositionCategoryCode = common.LOINCSocialHistory
case "FAMILY_HISTORY":
compositionCategoryCode = common.LOINCFamilyHistory
case "EXAMINATION":
compositionCategoryCode = common.LOINCExamination
case "PLAN_OF_CARE":
compositionCategoryCode = common.LOINCPLANOFCARE
default:
return nil, fmt.Errorf("category is needed")
}

compositionCategoryConcept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, compositionCategoryCode)
compositionCategoryCode, err := c.mapCategoryEnumToCode(input.Category)
if err != nil {
return nil, err
}

compositionTypeConcept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, common.LOINCProgressNoteCode)
compositionConcept, err := c.mapCompositionConcepts(ctx, compositionCategoryCode, common.LOINCProgressNoteCode)
if err != nil {
return nil, err
}
Expand All @@ -91,24 +72,24 @@ func (c *UseCasesClinicalImpl) CreateComposition(ctx context.Context, input dto.
Type: &domain.FHIRCodeableConceptInput{
Coding: []*domain.FHIRCodingInput{
{
System: (*scalarutils.URI)(&compositionTypeConcept.URL),
Code: scalarutils.Code(compositionTypeConcept.ID),
Display: compositionTypeConcept.DisplayName,
System: (*scalarutils.URI)(&compositionConcept.CompositionTypeConcept.URL),
Code: scalarutils.Code(compositionConcept.CompositionTypeConcept.ID),
Display: compositionConcept.CompositionTypeConcept.DisplayName,
},
},
Text: compositionTypeConcept.DisplayName,
Text: compositionConcept.CompositionTypeConcept.DisplayName,
},
Category: []*domain.FHIRCodeableConceptInput{
{
ID: &id,
Coding: []*domain.FHIRCodingInput{
{
System: (*scalarutils.URI)(&compositionCategoryConcept.URL),
Code: scalarutils.Code(compositionCategoryConcept.ID),
Display: compositionCategoryConcept.DisplayName,
System: (*scalarutils.URI)(&compositionConcept.CompositionCategoryConcept.URL),
Code: scalarutils.Code(compositionConcept.CompositionCategoryConcept.ID),
Display: compositionConcept.CompositionCategoryConcept.DisplayName,
},
},
Text: compositionCategoryConcept.DisplayName,
Text: compositionConcept.CompositionCategoryConcept.DisplayName,
},
},
Subject: &domain.FHIRReferenceInput{
Expand All @@ -132,18 +113,18 @@ func (c *UseCasesClinicalImpl) CreateComposition(ctx context.Context, input dto.
Section: []*domain.FHIRCompositionSectionInput{
{
ID: &id,
Title: &compositionCategoryConcept.DisplayName,
Title: &compositionConcept.CompositionCategoryConcept.DisplayName,
Code: &domain.FHIRCodeableConceptInput{
ID: &id,
Coding: []*domain.FHIRCodingInput{
{
ID: &id,
System: (*scalarutils.URI)(&compositionCategoryConcept.URL),
Code: scalarutils.Code(compositionCategoryConcept.ID),
Display: compositionCategoryConcept.DisplayName,
System: (*scalarutils.URI)(&compositionConcept.CompositionCategoryConcept.URL),
Code: scalarutils.Code(compositionConcept.CompositionCategoryConcept.ID),
Display: compositionConcept.CompositionCategoryConcept.DisplayName,
},
},
Text: compositionTypeConcept.DisplayName,
Text: compositionConcept.CompositionTypeConcept.DisplayName,
},
Author: []*domain.FHIRReferenceInput{
{
Expand Down Expand Up @@ -178,12 +159,12 @@ func (c *UseCasesClinicalImpl) CreateComposition(ctx context.Context, input dto.
ID: &id,
Coding: []*domain.FHIRCodingInput{
{
System: (*scalarutils.URI)(&compositionCategoryConcept.URL),
Code: scalarutils.Code(compositionCategoryConcept.ID),
Display: compositionCategoryConcept.DisplayName,
System: (*scalarutils.URI)(&compositionConcept.CompositionCategoryConcept.URL),
Code: scalarutils.Code(compositionConcept.CompositionCategoryConcept.ID),
Display: compositionConcept.CompositionCategoryConcept.DisplayName,
},
},
Text: compositionCategoryConcept.DisplayName,
Text: compositionConcept.CompositionCategoryConcept.DisplayName,
},
}

Expand Down Expand Up @@ -332,21 +313,9 @@ func (c *UseCasesClinicalImpl) AppendNoteToComposition(ctx context.Context, id s

organizationRef := fmt.Sprintf("Organization/%s", identifiers.OrganizationID)

var compositionCategoryCode string

switch input.Category {
case "ASSESSMENT_PLAN":
compositionCategoryCode = common.LOINCAssessmentPlanCode
case "HISTORY_OF_PRESENTING_ILLNESS":
compositionCategoryCode = common.LOINCHistoryOfPresentingIllness
case "SOCIAL_HISTORY":
compositionCategoryCode = common.LOINCSocialHistory
case "FAMILY_HISTORY":
compositionCategoryCode = common.LOINCFamilyHistory
case "EXAMINATION":
compositionCategoryCode = common.LOINCExamination
case "PLAN_OF_CARE":
compositionCategoryCode = common.LOINCPLANOFCARE
compositionCategoryCode, err := c.mapCategoryEnumToCode(input.Category)
if err != nil {
return nil, err
}

compositionCategoryConcept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, compositionCategoryCode)
Expand Down
60 changes: 60 additions & 0 deletions pkg/clinical/usecases/clinical/composition_helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package clinical

import (
"context"
"fmt"

"github.com/savannahghi/clinical/pkg/clinical/application/common"
"github.com/savannahghi/clinical/pkg/clinical/application/dto"
"github.com/savannahghi/clinical/pkg/clinical/domain"
)

// CompositionConcept is used to map composition concepts
type CompositionConcept struct {
CompositionCategoryConcept *domain.Concept
CompositionTypeConcept *domain.Concept
}

// mapCategoryEnumToCode is used to map various composition categories to respective LOINC codes
func (*UseCasesClinicalImpl) mapCategoryEnumToCode(category dto.CompositionCategory) (string, error) {
var compositionCategoryCode string

switch category {
case "ASSESSMENT_PLAN":
compositionCategoryCode = common.LOINCAssessmentPlanCode
case "HISTORY_OF_PRESENTING_ILLNESS":
compositionCategoryCode = common.LOINCHistoryOfPresentingIllness
case "SOCIAL_HISTORY":
compositionCategoryCode = common.LOINCSocialHistory
case "FAMILY_HISTORY":
compositionCategoryCode = common.LOINCFamilyHistory
case "EXAMINATION":
compositionCategoryCode = common.LOINCExamination
case "PLAN_OF_CARE":
compositionCategoryCode = common.LOINCPlanOfCare
case "REFERRAL_NOTE":
compositionCategoryCode = common.LOINCReferralNote
default:
return "", fmt.Errorf("category is needed")
}

return compositionCategoryCode, nil
}

// mapCompositionConcepts composes a unified representation of composition concepts and types into a single model
func (c *UseCasesClinicalImpl) mapCompositionConcepts(ctx context.Context, compositionCategoryCode, conceptID string) (*CompositionConcept, error) {
compositionCategoryConcept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, compositionCategoryCode)
if err != nil {
return nil, err
}

compositionTypeConcept, err := c.GetConcept(ctx, dto.TerminologySourceLOINC, conceptID)
if err != nil {
return nil, err
}

return &CompositionConcept{
CompositionCategoryConcept: compositionCategoryConcept,
CompositionTypeConcept: compositionTypeConcept,
}, nil
}
Loading

0 comments on commit 2cfb9a8

Please sign in to comment.