@ampath/esm-dha-workflow-app 4.0.0-next.340 → 4.0.0-next.344

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/1149.js +1 -1
  2. package/dist/1171.js +1 -0
  3. package/dist/1171.js.map +1 -0
  4. package/dist/1177.js +1 -0
  5. package/dist/1177.js.map +1 -0
  6. package/dist/1239.js +1 -0
  7. package/dist/1239.js.map +1 -0
  8. package/dist/1551.js +1 -1
  9. package/dist/1560.js +1 -0
  10. package/dist/1560.js.map +1 -0
  11. package/dist/1928.js +1 -0
  12. package/dist/1928.js.map +1 -0
  13. package/dist/2093.js +1 -1
  14. package/dist/2230.js +1 -1
  15. package/dist/2493.js +1 -1
  16. package/dist/2914.js +1 -1
  17. package/dist/3078.js +1 -0
  18. package/dist/3078.js.map +1 -0
  19. package/dist/327.js +1 -0
  20. package/dist/327.js.map +1 -0
  21. package/dist/4605.js +1 -1
  22. package/dist/4611.js +1 -1
  23. package/dist/4674.js +1 -1
  24. package/dist/4674.js.map +1 -1
  25. package/dist/4986.js +1 -1
  26. package/dist/5167.js +1 -1
  27. package/dist/5317.js +1 -0
  28. package/dist/5317.js.map +1 -0
  29. package/dist/5344.js +1 -0
  30. package/dist/{2936.js.map → 5344.js.map} +1 -1
  31. package/dist/5765.js +1 -0
  32. package/dist/5765.js.map +1 -0
  33. package/dist/5851.js +1 -1
  34. package/dist/5851.js.map +1 -1
  35. package/dist/5961.js +1 -1
  36. package/dist/6264.js +1 -1
  37. package/dist/6264.js.map +1 -1
  38. package/dist/6720.js +1 -1
  39. package/dist/6942.js +1 -1
  40. package/dist/6942.js.map +1 -1
  41. package/dist/7521.js +1 -1
  42. package/dist/7521.js.map +1 -1
  43. package/dist/7549.js +1 -0
  44. package/dist/7549.js.map +1 -0
  45. package/dist/7717.js +1 -1
  46. package/dist/7857.js +1 -0
  47. package/dist/7857.js.map +1 -0
  48. package/dist/850.js +1 -0
  49. package/dist/850.js.map +1 -0
  50. package/dist/8733.js +1 -1
  51. package/dist/9070.js +1 -1
  52. package/dist/9093.js +1 -1
  53. package/dist/9093.js.map +1 -1
  54. package/dist/9338.js +1 -1
  55. package/dist/9338.js.map +1 -1
  56. package/dist/9349.js +1 -0
  57. package/dist/9349.js.map +1 -0
  58. package/dist/9428.js +1 -1
  59. package/dist/9428.js.map +1 -1
  60. package/dist/9789.js +1 -0
  61. package/dist/9789.js.map +1 -0
  62. package/dist/9871.js +1 -0
  63. package/dist/9871.js.map +1 -0
  64. package/dist/esm-dha-workflow-app.js +1 -1
  65. package/dist/esm-dha-workflow-app.js.buildmanifest.json +362 -239
  66. package/dist/esm-dha-workflow-app.js.map +1 -1
  67. package/dist/main.js +1 -1
  68. package/dist/main.js.map +1 -1
  69. package/dist/routes.json +1 -1
  70. package/package.json +1 -1
  71. package/src/billing/billing-claims.resource.ts +8 -7
  72. package/src/billing/dashboard/v2/clearance/cash.component.tsx +9 -9
  73. package/src/billing/dashboard/v2/clearance/pay-cash.component.tsx +24 -22
  74. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.tsx +5 -4
  75. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.component.tsx +2 -2
  76. package/src/billing/dashboard/v2/patient-bill-details/attachments/generate-attachments.component.tsx +15 -4
  77. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.component.tsx +2 -2
  78. package/src/billing/dashboard/v2/types/index.ts +6 -0
  79. package/src/billing/dashboard/v3/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +6 -1
  80. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.tsx +5 -8
  81. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.tsx +65 -62
  82. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.tsx +30 -16
  83. package/src/billing/dashboard/v3/patient-bill-details/attachments/generate-attachments.component.tsx +3 -1
  84. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.scss +4 -0
  85. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.tsx +154 -156
  86. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.tsx +22 -23
  87. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.tsx +5 -4
  88. package/src/dashboard/dashboard.component.tsx +3 -2
  89. package/src/dashboard/overview/overview.component.tsx +3 -1
  90. package/src/dashboard-meta/emt-dashboard.meta.ts +6 -0
  91. package/src/emt/cr-lookup.resource.test.ts +88 -0
  92. package/src/emt/cr-lookup.resource.ts +42 -0
  93. package/src/emt/emt-queue.component.test.tsx +324 -0
  94. package/src/emt/emt-queue.component.tsx +449 -0
  95. package/src/emt/emt-queue.scss +83 -0
  96. package/src/emt/emt.resource.test.ts +247 -0
  97. package/src/emt/emt.resource.ts +150 -0
  98. package/src/emt/handover-modal/handover-modal.component.test.tsx +273 -0
  99. package/src/emt/handover-modal/handover-modal.component.tsx +524 -0
  100. package/src/emt/handover-modal/handover-modal.scss +88 -0
  101. package/src/emt/types/emt.types.ts +137 -0
  102. package/src/index.ts +10 -0
  103. package/src/registry/registry.component.tsx +49 -1
  104. package/src/registry/utils/hie-client-adapter.ts +1 -1
  105. package/src/root.component.tsx +2 -0
  106. package/src/routes.json +25 -0
  107. package/src/side-nav-menu/nav-link-config.ts +4 -0
  108. package/dist/1362.js +0 -1
  109. package/dist/1362.js.map +0 -1
  110. package/dist/203.js +0 -1
  111. package/dist/203.js.map +0 -1
  112. package/dist/2200.js +0 -1
  113. package/dist/2200.js.map +0 -1
  114. package/dist/2936.js +0 -1
  115. package/dist/2988.js +0 -1
  116. package/dist/2988.js.map +0 -1
  117. package/dist/307.js +0 -1
  118. package/dist/307.js.map +0 -1
  119. package/dist/4008.js +0 -1
  120. package/dist/4008.js.map +0 -1
  121. package/dist/446.js +0 -1
  122. package/dist/446.js.map +0 -1
  123. package/dist/5097.js +0 -1
  124. package/dist/5097.js.map +0 -1
  125. package/dist/7240.js +0 -1
  126. package/dist/7240.js.map +0 -1
  127. package/dist/874.js +0 -1
  128. package/dist/874.js.map +0 -1
@@ -33,8 +33,8 @@ const InvoiceComponent = forwardRef<HTMLDivElement, InvoiceComponentProps>(({ bi
33
33
  }
34
34
 
35
35
  const items =
36
- Array.isArray(bill.items) && bill.items.length > 0
37
- ? bill.items
36
+ Array.isArray(bill) && bill.length > 0
37
+ ? bill
38
38
  : [
39
39
  {
40
40
  billable_service: bill.billable_service,
@@ -470,6 +470,12 @@ export interface PatientBill {
470
470
  payments: BillPayment[];
471
471
  visit_uuid: string;
472
472
  visit_type_uuid: string;
473
+ location_name: string;
474
+ location_uuid: string;
475
+ national_id: string;
476
+ paid_status: string;
477
+ visit_start_date: string;
478
+ cr_id: string;
473
479
  }
474
480
 
475
481
  export interface PendingLineItem {
@@ -27,6 +27,7 @@ interface claimInterventionDetailsProps {
27
27
  visitUuid: string;
28
28
  canSwitchIntervention?: boolean;
29
29
  onSwitchSuccess?: () => void;
30
+ billingDate: string;
30
31
  }
31
32
 
32
33
  const isActiveIntervention = (iv: VisitIntervention) => (iv.workflow_state ?? '').toUpperCase() === 'ACTIVE';
@@ -38,6 +39,7 @@ const ClaimInterventionDetails: React.FC<claimInterventionDetailsProps> = ({
38
39
  visitUuid,
39
40
  canSwitchIntervention = false,
40
41
  onSwitchSuccess,
42
+ billingDate,
41
43
  }) => {
42
44
  const session = useSession();
43
45
  const locationUuid = session?.sessionLocation?.uuid;
@@ -61,6 +63,7 @@ const ClaimInterventionDetails: React.FC<claimInterventionDetailsProps> = ({
61
63
  claimInterventions: ci,
62
64
  bill: patientBillDetails,
63
65
  patientUuid: patientBillDetails?.patient_uuid,
66
+ billingDate: billingDate,
64
67
  });
65
68
  };
66
69
 
@@ -75,7 +78,9 @@ const ClaimInterventionDetails: React.FC<claimInterventionDetailsProps> = ({
75
78
  canActOnIntervention(intervention) && !hasBlockingPreauth(intervention);
76
79
 
77
80
  const canRaisePreauthFor = (intervention: VisitIntervention) => {
78
- return canActOnIntervention(intervention) && Boolean(intervention.needs_preauth) && !hasBlockingPreauth(intervention);
81
+ return (
82
+ canActOnIntervention(intervention) && Boolean(intervention.needs_preauth) && !hasBlockingPreauth(intervention)
83
+ );
79
84
  };
80
85
 
81
86
  const isResubmitPreauth = (intervention: VisitIntervention) =>
@@ -26,6 +26,7 @@ interface claimVisitDetailsProps {
26
26
  onBillDetailsChange?: () => void;
27
27
  /** True while claim preview is revalidating — stand down content edits. */
28
28
  claimRefreshing?: boolean;
29
+ billingDate?: string;
29
30
  }
30
31
  const ClaimVisitDetails: React.FC<claimVisitDetailsProps> = ({
31
32
  claimsVisit,
@@ -33,6 +34,7 @@ const ClaimVisitDetails: React.FC<claimVisitDetailsProps> = ({
33
34
  patientBillDetails,
34
35
  onBillDetailsChange,
35
36
  claimRefreshing = false,
37
+ billingDate,
36
38
  }) => {
37
39
  const [showCloseClaimModal, setShowCloseClaimModal] = useState<boolean>();
38
40
  const [showSubmitClaimModal, setSubmitCloseClaimModal] = useState<boolean>(false);
@@ -181,16 +183,10 @@ const ClaimVisitDetails: React.FC<claimVisitDetailsProps> = ({
181
183
  <h4>Claim Visit Details</h4>
182
184
  </div>
183
185
  <div className={styles.headerAction}>
184
- <Button
185
- kind="primary"
186
- onClick={displayCloseClaimModal}
187
- disabled={!canEditClaim}>
186
+ <Button kind="primary" onClick={displayCloseClaimModal} disabled={!canEditClaim}>
188
187
  Close Claim
189
188
  </Button>
190
- <Button
191
- kind="tertiary"
192
- onClick={displayCloseSubmitClaimModal}
193
- disabled={!canEditClaim}>
189
+ <Button kind="tertiary" onClick={displayCloseSubmitClaimModal} disabled={!canEditClaim}>
194
190
  Submit claim
195
191
  </Button>
196
192
  <Button
@@ -290,6 +286,7 @@ const ClaimVisitDetails: React.FC<claimVisitDetailsProps> = ({
290
286
  invalidateProviderClaimPreview();
291
287
  onBillDetailsChange?.();
292
288
  }}
289
+ billingDate={billingDate}
293
290
  />
294
291
  )}
295
292
  </div>
@@ -57,11 +57,11 @@ const FacilityBillsV3: React.FC<facilityBillsProps> = ({ billingDate, locationUu
57
57
  const statusArr = status.split(',');
58
58
 
59
59
  if (statusArr.length > 0) {
60
- const hasPostedBill = statusArr.some((s) => {
60
+ const hasPostedBill = statusArr.some((s) => {
61
61
  return s === 'POSTED';
62
62
  });
63
- if(hasPostedBill){
64
- return 'PARTIALLY PAID'
63
+ if (hasPostedBill) {
64
+ return 'PARTIALLY PAID';
65
65
  }
66
66
  const hasPendingBill = statusArr.some((s) => {
67
67
  return s === 'PENDING';
@@ -75,74 +75,77 @@ const FacilityBillsV3: React.FC<facilityBillsProps> = ({ billingDate, locationUu
75
75
  return status;
76
76
  }
77
77
  }
78
- const filteredBills = (facilityBills ?? []).filter((fb) => {
79
- const term = search.trim().toLowerCase();
80
- return (
81
- !term ||
82
- `${fb.patient_name} ${formatStatusColumn(fb.bill_status)} ${fb.cash_point}`.toLowerCase().includes(term)
83
- );
84
- });
78
+
79
+ const formatDate = (date?: string | null) => {
80
+ if (!date) return '—';
81
+
82
+ return new Intl.DateTimeFormat('en-KE', {
83
+ year: 'numeric',
84
+ month: 'short',
85
+ day: '2-digit',
86
+ }).format(new Date(date));
87
+ };
85
88
 
86
89
  return (
87
90
  <>
88
91
  <TableToolbar
89
- id="facility-bills"
90
- search={search}
91
- onSearch={setSearch}
92
- searchPlaceholder="Search patient, status or cash point…"
93
- onDate={onDateChange}
92
+ id="facility-bills"
93
+ search={search}
94
+ onSearch={setSearch}
95
+ searchPlaceholder="Search patient, status or cash point…"
96
+ onDate={onDateChange}
94
97
  />
95
98
  {currentView === BillingView.Bills ? (
96
99
  (facilityBills ?? []).length === 0 ? (
97
100
  <EmptyState message="No bills." />
98
101
  ) : (
99
- <>
100
- {filteredBills.length === 0 ? (
101
- <EmptyState message="No bills match your search." />
102
- ) : (
103
- <Table aria-label="facility bills" size="sm">
104
- <TableHead>
105
- <TableRow>
106
- <TableHeader>No</TableHeader>
107
- <TableHeader>Date</TableHeader>
108
- <TableHeader>Patient</TableHeader>
109
- <TableHeader>Status</TableHeader>
110
- <TableHeader>Cashpoint</TableHeader>
111
- </TableRow>
112
- </TableHead>
113
- <TableBody>
114
- {filteredBills.map((fb, index) => {
115
- return (
116
- <TableRow key={fb.patient_uuid}>
117
- <TableCell>{index + 1}</TableCell>
118
- <TableCell>{fb.bill_date}</TableCell>
119
- <TableCell>
120
- <div
121
- className={styles.clickableData}
122
- onClick={() => toggleView(BillingView.BillDetails, fb.patient_uuid)}
123
- >
124
- {fb.patient_name}
125
- </div>
126
- </TableCell>
127
- <TableCell>
128
- {(() => {
129
- const s = formatStatusColumn(fb.bill_status);
130
- const type = s === 'PAID' ? 'green' : s === 'PENDING' ? 'gray' : 'blue';
131
- return (
132
- <Tag size="sm" type={type}>
133
- {s}
134
- </Tag>
135
- );
136
- })()}
137
- </TableCell>
138
- <TableCell>{fb.cash_point}</TableCell>
139
- </TableRow>
140
- );
141
- })}
142
- </TableBody>
143
- </Table>
144
- )}
145
- </>
102
+ <>
103
+ {facilityBills.length === 0 ? (
104
+ <EmptyState message="No bills match your search." />
105
+ ) : (
106
+ <Table aria-label="facility bills" size="sm">
107
+ <TableHead>
108
+ <TableRow>
109
+ <TableHeader>No</TableHeader>
110
+ <TableHeader>Date</TableHeader>
111
+ <TableHeader>Patient</TableHeader>
112
+ <TableHeader>Status</TableHeader>
113
+ <TableHeader>Identifier</TableHeader>
114
+ </TableRow>
115
+ </TableHead>
116
+ <TableBody>
117
+ {facilityBills.map((fb, index) => {
118
+ return (
119
+ <TableRow key={fb.patient_uuid}>
120
+ <TableCell>{index + 1}</TableCell>
121
+ <TableCell>{formatDate(fb.visit_start_date)}</TableCell>
122
+ <TableCell>
123
+ <div
124
+ className={styles.clickableData}
125
+ onClick={() => toggleView(BillingView.BillDetails, fb.patient_uuid)}
126
+ >
127
+ {fb.patient_name}
128
+ </div>
129
+ </TableCell>
130
+ <TableCell>
131
+ {(() => {
132
+ const s = formatStatusColumn(fb.paid_status);
133
+ const type = s === 'PAID' ? 'green' : s === 'PENDING' ? 'gray' : 'blue';
134
+ return (
135
+ <Tag size="sm" type={type}>
136
+ {s}
137
+ </Tag>
138
+ );
139
+ })()}
140
+ </TableCell>
141
+ <TableCell>{fb.cr_id}</TableCell>
142
+ </TableRow>
143
+ );
144
+ })}
145
+ </TableBody>
146
+ </Table>
147
+ )}
148
+ </>
146
149
  )
147
150
  ) : (
148
151
  <></>
@@ -29,9 +29,10 @@ function SectionBlock({ number, title, children }) {
29
29
 
30
30
  interface CaseSummaryProps {
31
31
  patientUuid: string;
32
+ billingDate: string;
32
33
  }
33
34
 
34
- const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid }, ref) => {
35
+ const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid, billingDate }, ref) => {
35
36
  const [caseSummary, setCasesummary] = useState<VisitSummaryResponse>();
36
37
  const [vitals, setVitals] = useState<VitalReading[]>();
37
38
  const session = useSession();
@@ -64,6 +65,13 @@ const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid
64
65
  });
65
66
  }
66
67
  };
68
+ const filteredConditions =
69
+ caseSummary?.conditions?.filter((condition) => {
70
+ const conditionDate = formatDate(condition.onsetDate);
71
+ const billDate = formatDate(billingDate);
72
+
73
+ return conditionDate === billDate;
74
+ }) ?? [];
67
75
 
68
76
  useEffect(() => {
69
77
  if (!locationUuid) return;
@@ -106,11 +114,15 @@ const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid
106
114
  {/* {p.alert && <div className={styles['cs-alert']}>{p.alert}</div>} */}
107
115
 
108
116
  <SectionBlock number="1" title="Allergies">
109
- {caseSummary?.allergies.map((a, i) => (
110
- <div key={i} className={styles['cs-field-value']}>
111
- ✓ {a.label}
112
- </div>
113
- ))}
117
+ {caseSummary?.allergies?.length ? (
118
+ caseSummary.allergies.map((a, i) => (
119
+ <div key={i} className={styles['cs-field-value']}>
120
+ ✓ {a.substance} ({a.criticality}) — {a.reaction}
121
+ </div>
122
+ ))
123
+ ) : (
124
+ <div className={styles['cs-field-value']}>No known allergies</div>
125
+ )}
114
126
  </SectionBlock>
115
127
 
116
128
  <SectionBlock number="2" title="Active Diagnoses">
@@ -118,16 +130,14 @@ const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid
118
130
  <thead>
119
131
  <tr>
120
132
  <th>Date</th>
121
- <th>Code</th>
122
133
  <th>Description</th>
123
134
  <th>Status</th>
124
135
  </tr>
125
136
  </thead>
126
137
  <tbody>
127
- {caseSummary?.conditions.map((d, i) => (
138
+ {filteredConditions?.map((d, i) => (
128
139
  <tr key={i}>
129
140
  <td>{formatDate(d.onsetDate)}</td>
130
- <td>{d.code}</td>
131
141
  <td>
132
142
  {d.description}
133
143
  {d.primary && <span className={styles['cs-pill']}>Primary</span>}
@@ -233,13 +243,17 @@ const CaseSummary = forwardRef<HTMLDivElement, CaseSummaryProps>(({ patientUuid
233
243
  </SectionBlock>
234
244
 
235
245
  <SectionBlock number="7" title="Admission Details">
236
- <div className={styles['cs-field-grid']}>
237
- <Field label="Status" value={caseSummary?.inpatientDetails?.status} />
238
- <Field label="Admission Date" value={formatDate(caseSummary?.inpatientDetails?.admissionDate)} />
239
- <Field label="Admission Diagnosis" value={caseSummary?.inpatientDetails?.diagnosis} />
240
- <Field label="Primary Doctor" value={caseSummary?.inpatientDetails?.admittingDoctor} />
241
- <Field label="Ward / Bed" value={caseSummary?.inpatientDetails?.ward} />
242
- </div>
246
+ {caseSummary?.inpatientDetails ? (
247
+ <div className={styles['cs-field-grid']}>
248
+ <Field label="Status" value={caseSummary?.inpatientDetails?.status} />
249
+ <Field label="Admission Date" value={formatDate(caseSummary?.inpatientDetails?.admissionDate)} />
250
+ <Field label="Admission Diagnosis" value={caseSummary?.inpatientDetails?.diagnosis} />
251
+ <Field label="Primary Doctor" value={caseSummary?.inpatientDetails?.admittingDoctor} />
252
+ <Field label="Ward / Bed" value={caseSummary?.inpatientDetails?.ward} />
253
+ </div>
254
+ ) : (
255
+ <></>
256
+ )}
243
257
  </SectionBlock>
244
258
 
245
259
  {/* <SectionBlock number="8" title="Encounter Log">
@@ -23,6 +23,7 @@ interface GenerateAttachmentsProps extends DefaultWorkspaceProps {
23
23
  bill: any;
24
24
  consentToken: string;
25
25
  patientUuid: string;
26
+ billingDate: string;
26
27
  }
27
28
 
28
29
  const GenerateAttachments: React.FC<GenerateAttachmentsProps> = ({
@@ -32,6 +33,7 @@ const GenerateAttachments: React.FC<GenerateAttachmentsProps> = ({
32
33
  bill,
33
34
  consentToken,
34
35
  patientUuid,
36
+ billingDate,
35
37
  }) => {
36
38
  const { t } = useTranslation();
37
39
  const [previewUrl, setPreviewUrl] = useState<string>();
@@ -332,7 +334,7 @@ const GenerateAttachments: React.FC<GenerateAttachmentsProps> = ({
332
334
  <DischargeSummaryComponent ref={dischargeRef} claimIntervention={claimInterventions} bill={bill} />
333
335
 
334
336
  <FinalBillComponent ref={finalBillRef} bill={bill} />
335
- <CaseSummary ref={caseSummaryRef} patientUuid={patientUuid} />
337
+ <CaseSummary ref={caseSummaryRef} patientUuid={patientUuid} billingDate={billingDate} />
336
338
  <DialysisChart ref={dialysisRef} patientUuid={patientUuid} />
337
339
  <GeneralDischargeSummary ref={generalDischargeSummary} patientUuid={patientUuid} />
338
340
  </div>
@@ -10,4 +10,8 @@
10
10
  width: 100%;
11
11
  row-gap: 10px;
12
12
  }
13
+ }
14
+ .radioGroup {
15
+ margin: 1rem;
16
+
13
17
  }