@ampath/esm-dha-workflow-app 4.0.0-next.33 → 4.0.0-next.331

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 (758) hide show
  1. package/README.md +19 -0
  2. package/dist/1149.js +1 -0
  3. package/dist/1149.js.map +1 -0
  4. package/dist/1197.js +1 -0
  5. package/dist/1362.js +1 -0
  6. package/dist/1362.js.map +1 -0
  7. package/dist/1551.js +1 -0
  8. package/dist/1551.js.map +1 -0
  9. package/dist/1925.js +1 -0
  10. package/dist/1925.js.map +1 -0
  11. package/dist/1927.js +1 -0
  12. package/dist/1927.js.map +1 -0
  13. package/dist/203.js +1 -0
  14. package/dist/203.js.map +1 -0
  15. package/dist/2054.js +1 -0
  16. package/dist/2054.js.map +1 -0
  17. package/dist/2093.js +1 -0
  18. package/dist/2093.js.map +1 -0
  19. package/dist/2177.js +2 -0
  20. package/dist/2177.js.map +1 -0
  21. package/dist/2200.js +1 -0
  22. package/dist/2200.js.map +1 -0
  23. package/dist/2230.js +1 -0
  24. package/dist/2230.js.map +1 -0
  25. package/dist/2493.js +1 -0
  26. package/dist/2493.js.map +1 -0
  27. package/dist/262.js +2 -0
  28. package/dist/262.js.map +1 -0
  29. package/dist/2914.js +1 -0
  30. package/dist/2914.js.map +1 -0
  31. package/dist/2936.js +1 -0
  32. package/dist/2936.js.map +1 -0
  33. package/dist/2988.js +1 -0
  34. package/dist/2988.js.map +1 -0
  35. package/dist/3041.js +1 -0
  36. package/dist/3041.js.map +1 -0
  37. package/dist/307.js +1 -0
  38. package/dist/307.js.map +1 -0
  39. package/dist/3099.js +1 -0
  40. package/dist/3184.js +2 -0
  41. package/dist/3184.js.map +1 -0
  42. package/dist/3202.js +1 -0
  43. package/dist/3202.js.map +1 -0
  44. package/dist/3222.js +1 -0
  45. package/dist/3222.js.map +1 -0
  46. package/dist/3406.js +1 -0
  47. package/dist/3406.js.map +1 -0
  48. package/dist/347.js +1 -0
  49. package/dist/347.js.map +1 -0
  50. package/dist/3654.js +1 -0
  51. package/dist/3654.js.map +1 -0
  52. package/dist/4003.js +1 -0
  53. package/dist/4003.js.map +1 -0
  54. package/dist/4008.js +1 -0
  55. package/dist/4008.js.map +1 -0
  56. package/dist/4055.js +1 -0
  57. package/dist/4205.js +1 -0
  58. package/dist/4205.js.map +1 -0
  59. package/dist/4225.js +1 -0
  60. package/dist/4225.js.map +1 -0
  61. package/dist/4231.js +1 -0
  62. package/dist/4231.js.map +1 -0
  63. package/dist/4300.js +1 -0
  64. package/dist/4335.js +1 -0
  65. package/dist/4353.js +1 -0
  66. package/dist/4353.js.map +1 -0
  67. package/dist/4431.js +1 -0
  68. package/dist/4431.js.map +1 -0
  69. package/dist/4454.js +1 -0
  70. package/dist/4454.js.map +1 -0
  71. package/dist/4457.js +2 -0
  72. package/dist/4457.js.LICENSE.txt +282 -0
  73. package/dist/4457.js.map +1 -0
  74. package/dist/446.js +1 -0
  75. package/dist/446.js.map +1 -0
  76. package/dist/4611.js +1 -0
  77. package/dist/4611.js.map +1 -0
  78. package/dist/4652.js +1 -0
  79. package/dist/4674.js +1 -0
  80. package/dist/4674.js.map +1 -0
  81. package/dist/4755.js +1 -0
  82. package/dist/4755.js.map +1 -0
  83. package/dist/4986.js +1 -0
  84. package/dist/4986.js.map +1 -0
  85. package/dist/5097.js +1 -0
  86. package/dist/5097.js.map +1 -0
  87. package/dist/5119.js +1 -0
  88. package/dist/5119.js.map +1 -0
  89. package/dist/5167.js +1 -0
  90. package/dist/5167.js.map +1 -0
  91. package/dist/5380.js +1 -0
  92. package/dist/5380.js.map +1 -0
  93. package/dist/5422.js +1 -0
  94. package/dist/5422.js.map +1 -0
  95. package/dist/5576.js +1 -0
  96. package/dist/5576.js.map +1 -0
  97. package/dist/5851.js +1 -0
  98. package/dist/5851.js.map +1 -0
  99. package/dist/5961.js +1 -0
  100. package/dist/5961.js.map +1 -0
  101. package/dist/6264.js +1 -0
  102. package/dist/6264.js.map +1 -0
  103. package/dist/6540.js +2 -0
  104. package/dist/6540.js.map +1 -0
  105. package/dist/6606.js +1 -0
  106. package/dist/6606.js.map +1 -0
  107. package/dist/6720.js +1 -0
  108. package/dist/6720.js.map +1 -0
  109. package/dist/6824.js +1 -0
  110. package/dist/6824.js.map +1 -0
  111. package/dist/6942.js +1 -0
  112. package/dist/6942.js.map +1 -0
  113. package/dist/71.js +1 -0
  114. package/dist/71.js.map +1 -0
  115. package/dist/7207.js +1 -0
  116. package/dist/7207.js.map +1 -0
  117. package/dist/7240.js +1 -0
  118. package/dist/7240.js.map +1 -0
  119. package/dist/7255.js +1 -0
  120. package/dist/7255.js.map +1 -0
  121. package/dist/7271.js +1 -0
  122. package/dist/7271.js.map +1 -0
  123. package/dist/7420.js +1 -0
  124. package/dist/7420.js.map +1 -0
  125. package/dist/7521.js +1 -0
  126. package/dist/7521.js.map +1 -0
  127. package/dist/7557.js +1 -0
  128. package/dist/7557.js.map +1 -0
  129. package/dist/7717.js +1 -0
  130. package/dist/7717.js.map +1 -0
  131. package/dist/7830.js +2 -0
  132. package/dist/7830.js.map +1 -0
  133. package/dist/7879.js +1 -0
  134. package/dist/7879.js.map +1 -0
  135. package/dist/7941.js +1 -0
  136. package/dist/7941.js.map +1 -0
  137. package/dist/8091.js +1 -0
  138. package/dist/8091.js.map +1 -0
  139. package/dist/810.js +1 -2
  140. package/dist/810.js.map +1 -1
  141. package/dist/8558.js +1 -0
  142. package/dist/8558.js.map +1 -0
  143. package/dist/8733.js +1 -0
  144. package/dist/8733.js.map +1 -0
  145. package/dist/874.js +1 -0
  146. package/dist/874.js.map +1 -0
  147. package/dist/8895.js +1 -0
  148. package/dist/8895.js.map +1 -0
  149. package/dist/9070.js +1 -0
  150. package/dist/9070.js.map +1 -0
  151. package/dist/9091.js +1 -0
  152. package/dist/9091.js.map +1 -0
  153. package/dist/9093.js +1 -0
  154. package/dist/9093.js.map +1 -0
  155. package/dist/9249.js +1 -0
  156. package/dist/9249.js.map +1 -0
  157. package/dist/9338.js +1 -0
  158. package/dist/9338.js.map +1 -0
  159. package/dist/9418.js +2 -0
  160. package/dist/9418.js.LICENSE.txt +1 -0
  161. package/dist/9418.js.map +1 -0
  162. package/dist/9428.js +1 -0
  163. package/dist/9428.js.map +1 -0
  164. package/dist/9721.js +1 -0
  165. package/dist/9721.js.map +1 -0
  166. package/dist/esm-dha-workflow-app.js +1 -1
  167. package/dist/esm-dha-workflow-app.js.buildmanifest.json +1675 -210
  168. package/dist/esm-dha-workflow-app.js.map +1 -1
  169. package/dist/main.js +1 -1
  170. package/dist/main.js.map +1 -1
  171. package/dist/routes.json +1 -1
  172. package/local-config.json +5 -0
  173. package/package.json +16 -6
  174. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  175. package/src/admissions/admission-request-list/admission-request-list.tsx +263 -0
  176. package/src/admissions/admissions-dashboard.component.scss +15 -0
  177. package/src/admissions/admissions-dashboard.component.tsx +277 -0
  178. package/src/admissions/admissions.resource.ts +233 -0
  179. package/src/admissions/admitted-list/admitted-patients-list.tsx +206 -0
  180. package/src/admissions/awaiting-discharge-list/awaiting-discharge-list.tsx +197 -0
  181. package/src/admissions/bed-assigment-request/bed-assignment-request-list.tsx +134 -0
  182. package/src/admissions/constants/index.ts +33 -0
  183. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  184. package/src/admissions/discharged-list/discharged-list.tsx +67 -0
  185. package/src/admissions/form-entry-workspace/form-entry-workspace.tsx +62 -0
  186. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  187. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  188. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  189. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  190. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  191. package/src/admissions/modal/add-bill-items/add-bill-items.modal.scss +17 -0
  192. package/src/admissions/modal/add-bill-items/add-bill-items.modal.tsx +233 -0
  193. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  194. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  195. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  196. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +111 -0
  197. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  198. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  199. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  200. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  201. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  202. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +86 -0
  203. package/src/admissions/types/index.ts +263 -0
  204. package/src/appointments/appointments.component.scss +6 -0
  205. package/src/appointments/appointments.component.tsx +8 -1
  206. package/src/billing/api/billing.api.ts +139 -0
  207. package/src/billing/billing-claims.resource.ts +900 -0
  208. package/src/billing/billing-dashboard-link.component.tsx +31 -0
  209. package/src/billing/billing-dashboard-reset.ts +27 -0
  210. package/src/billing/billing-root.tsx +42 -0
  211. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  212. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  213. package/src/billing/dashboard/v2/active-visits/active-visits.component.tsx +257 -0
  214. package/src/billing/dashboard/v2/active-visits/active-visits.resource.ts +85 -0
  215. package/src/billing/dashboard/v2/active-visits/active-visits.scss +15 -0
  216. package/src/billing/dashboard/v2/active-visits.component.tsx +102 -0
  217. package/src/billing/dashboard/v2/admissions/admission-requests-tab.component.tsx +79 -0
  218. package/src/billing/dashboard/v2/billing-claims-dashboard.component.scss +209 -0
  219. package/src/billing/dashboard/v2/billing-claims-dashboard.component.tsx +347 -0
  220. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.scss +90 -0
  221. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.tsx +101 -0
  222. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.scss +199 -0
  223. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.tsx +361 -0
  224. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.resource.ts +239 -0
  225. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.scss +246 -0
  226. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.tsx +182 -0
  227. package/src/billing/dashboard/v2/claim-statuses.ts +143 -0
  228. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  229. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +35 -0
  230. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.scss +67 -0
  231. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.tsx +90 -0
  232. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.scss +28 -0
  233. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.tsx +36 -0
  234. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.scss +119 -0
  235. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.tsx +198 -0
  236. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.scss +5 -0
  237. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +160 -0
  238. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.scss +105 -0
  239. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.tsx +184 -0
  240. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.scss +161 -0
  241. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.tsx +328 -0
  242. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +96 -0
  243. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-document.component.tsx +236 -0
  244. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.scss +98 -0
  245. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.tsx +292 -0
  246. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +133 -0
  247. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +217 -0
  248. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-by-token.component.tsx +150 -0
  249. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.scss +13 -0
  250. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.tsx +116 -0
  251. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.scss +338 -0
  252. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.tsx +616 -0
  253. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.scss +5 -0
  254. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.tsx +133 -0
  255. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  256. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  257. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +17 -0
  258. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +56 -0
  259. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  260. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  261. package/src/billing/dashboard/v2/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  262. package/src/billing/dashboard/v2/claim-visits/shared/_empty-state.scss +28 -0
  263. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.scss +298 -0
  264. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.tsx +252 -0
  265. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.scss +42 -0
  266. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.tsx +54 -0
  267. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.scss +61 -0
  268. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.tsx +150 -0
  269. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  270. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  271. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  272. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.scss +595 -0
  273. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.tsx +810 -0
  274. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.resource.ts +282 -0
  275. package/src/billing/dashboard/v2/claims-accounting/bill-utils.ts +134 -0
  276. package/src/billing/dashboard/v2/claims-accounting/claim-detail.component.tsx +346 -0
  277. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.scss +546 -0
  278. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.tsx +206 -0
  279. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.resource.ts +337 -0
  280. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.scss +90 -0
  281. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.tsx +90 -0
  282. package/src/billing/dashboard/v2/claims-accounting/remittances.component.tsx +169 -0
  283. package/src/billing/dashboard/v2/claims-accounting/remittances.resource.ts +46 -0
  284. package/src/billing/dashboard/v2/claims-accounting/status-meta.ts +25 -0
  285. package/src/billing/dashboard/v2/clearance/cash-patients.scss +18 -0
  286. package/src/billing/dashboard/v2/clearance/cash.component.tsx +149 -0
  287. package/src/billing/dashboard/v2/clearance/clearance.component.scss +84 -0
  288. package/src/billing/dashboard/v2/clearance/clearance.component.tsx +225 -0
  289. package/src/billing/dashboard/v2/clearance/pay-cash.component.tsx +176 -0
  290. package/src/billing/dashboard/v2/clearance/pay-cash.scss +28 -0
  291. package/src/billing/dashboard/v2/clearance/prepaid-services.component.tsx +112 -0
  292. package/src/billing/dashboard/v2/facility-bills/claim-status.ts +249 -0
  293. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.scss +140 -0
  294. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.tsx +687 -0
  295. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  296. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +267 -0
  297. package/src/billing/dashboard/v2/facility-bills/preauths.component.tsx +124 -0
  298. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.scss +22 -0
  299. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.tsx +389 -0
  300. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.scss +0 -0
  301. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.tsx +0 -0
  302. package/src/billing/dashboard/v2/new-facility-bills/bills-table.component.tsx +78 -0
  303. package/src/billing/dashboard/v2/new-facility-bills/bills-table.scss +18 -0
  304. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.component.tsx +64 -0
  305. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.scss +146 -0
  306. package/src/billing/dashboard/v2/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  307. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachment.component.tsx +157 -0
  308. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachments.scss +92 -0
  309. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  310. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.tsx +326 -0
  311. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  312. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +269 -0
  313. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  314. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +124 -0
  315. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.component.tsx +152 -0
  316. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.scss +225 -0
  317. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  318. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +173 -0
  319. package/src/billing/dashboard/v2/patient-bill-details/attachments/generate-attachments.component.tsx +360 -0
  320. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.component.tsx +151 -0
  321. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.scss +225 -0
  322. package/src/billing/dashboard/v2/patient-bill-details/attachments/type.ts +44 -0
  323. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.scss +107 -0
  324. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.tsx +508 -0
  325. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.scss +30 -0
  326. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.tsx +94 -0
  327. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.scss +89 -0
  328. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.tsx +53 -0
  329. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.scss +32 -0
  330. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.tsx +215 -0
  331. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  332. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  333. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +186 -0
  334. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.scss +153 -0
  335. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.tsx +458 -0
  336. package/src/billing/dashboard/v2/patient-bill-details/payment-mode.ts +124 -0
  337. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.scss +27 -0
  338. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.tsx +222 -0
  339. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.scss +27 -0
  340. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.tsx +109 -0
  341. package/src/billing/dashboard/v2/preauth/preauth-attachments.component.tsx +389 -0
  342. package/src/billing/dashboard/v2/preauth/preauth-list.component.scss +38 -0
  343. package/src/billing/dashboard/v2/preauth/preauth-list.component.tsx +226 -0
  344. package/src/billing/dashboard/v2/preauth/preauth-status-tag.component.tsx +75 -0
  345. package/src/billing/dashboard/v2/preauth/preauth-typed-fields.md +125 -0
  346. package/src/billing/dashboard/v2/preauth/preauth.resource.ts +1067 -0
  347. package/src/billing/dashboard/v2/preauth/preauth.workspace.scss +91 -0
  348. package/src/billing/dashboard/v2/preauth/preauth.workspace.tsx +1802 -0
  349. package/src/billing/dashboard/v2/preauth/preauthorizations-tab.component.tsx +45 -0
  350. package/src/billing/dashboard/v2/sha-claims/sha-claims-table.component.tsx +36 -0
  351. package/src/billing/dashboard/v2/sha-claims/sha-claims.component.tsx +60 -0
  352. package/src/billing/dashboard/v2/sha-claims/sha-claims.scss +8 -0
  353. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.scss +17 -0
  354. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.tsx +15 -0
  355. package/src/billing/dashboard/v2/shared/empty-state.component.scss +24 -0
  356. package/src/billing/dashboard/v2/shared/empty-state.component.tsx +13 -0
  357. package/src/billing/dashboard/v2/shared/scroll-to-top.component.scss +54 -0
  358. package/src/billing/dashboard/v2/shared/scroll-to-top.component.tsx +54 -0
  359. package/src/billing/dashboard/v2/shared/table-toolbar.component.scss +77 -0
  360. package/src/billing/dashboard/v2/shared/table-toolbar.component.tsx +48 -0
  361. package/src/billing/dashboard/v2/types/index.ts +507 -0
  362. package/src/billing/dashboard/v3/active-visits/active-visits.component.tsx +256 -0
  363. package/src/billing/dashboard/v3/active-visits/active-visits.resource.ts +57 -0
  364. package/src/billing/dashboard/v3/active-visits/active-visits.scss +15 -0
  365. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.scss +90 -0
  366. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.tsx +101 -0
  367. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.scss +199 -0
  368. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.tsx +361 -0
  369. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.resource.ts +240 -0
  370. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.scss +246 -0
  371. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.tsx +182 -0
  372. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  373. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +44 -0
  374. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.scss +5 -0
  375. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.tsx +42 -0
  376. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.scss +10 -0
  377. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.tsx +25 -0
  378. package/src/billing/dashboard/v3/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +223 -0
  379. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.scss +6 -0
  380. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +85 -0
  381. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +0 -0
  382. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +109 -0
  383. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.scss +104 -0
  384. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.tsx +336 -0
  385. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.scss +5 -0
  386. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.tsx +139 -0
  387. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  388. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  389. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.scss +7 -0
  390. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.tsx +35 -0
  391. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +6 -0
  392. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +33 -0
  393. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  394. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  395. package/src/billing/dashboard/v3/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  396. package/src/billing/dashboard/v3/claim-visits/payer-preview/index.scss +140 -0
  397. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-tile.component.tsx +55 -0
  398. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-workspace.component.tsx +157 -0
  399. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-doctors.component.tsx +54 -0
  400. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-lines.component.tsx +48 -0
  401. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-notes.component.tsx +47 -0
  402. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-diagnoses.component.tsx +44 -0
  403. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-interventions.component.tsx +44 -0
  404. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  405. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  406. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  407. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.scss +595 -0
  408. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.tsx +810 -0
  409. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.resource.ts +282 -0
  410. package/src/billing/dashboard/v3/claims-accounting/bill-utils.ts +134 -0
  411. package/src/billing/dashboard/v3/claims-accounting/claim-detail.component.tsx +346 -0
  412. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.scss +546 -0
  413. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.tsx +206 -0
  414. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.resource.ts +337 -0
  415. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.scss +90 -0
  416. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.tsx +90 -0
  417. package/src/billing/dashboard/v3/claims-accounting/remittances.component.tsx +169 -0
  418. package/src/billing/dashboard/v3/claims-accounting/remittances.resource.ts +46 -0
  419. package/src/billing/dashboard/v3/claims-accounting/status-meta.ts +25 -0
  420. package/src/billing/dashboard/v3/clearance/clearance.component.scss +100 -0
  421. package/src/billing/dashboard/v3/clearance/clearance.component.tsx +0 -0
  422. package/src/billing/dashboard/v3/clearance/prepaid-services.component.tsx +112 -0
  423. package/src/billing/dashboard/v3/facility-bills/claim-status.ts +243 -0
  424. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.scss +9 -0
  425. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.tsx +172 -0
  426. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  427. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +232 -0
  428. package/src/billing/dashboard/v3/facility-bills/preauths.component.tsx +124 -0
  429. package/src/billing/dashboard/v3/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  430. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachment.component.tsx +157 -0
  431. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachments.scss +92 -0
  432. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary-helper.ts +58 -0
  433. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  434. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.tsx +273 -0
  435. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  436. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +314 -0
  437. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  438. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +126 -0
  439. package/src/billing/dashboard/v3/patient-bill-details/attachments/final-bill.component.tsx +75 -0
  440. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  441. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +253 -0
  442. package/src/billing/dashboard/v3/patient-bill-details/attachments/generate-attachments.component.tsx +343 -0
  443. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.component.tsx +150 -0
  444. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.scss +225 -0
  445. package/src/billing/dashboard/v3/patient-bill-details/attachments/type.ts +259 -0
  446. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.scss +13 -0
  447. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.tsx +205 -0
  448. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.scss +0 -0
  449. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.tsx +61 -0
  450. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  451. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  452. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.scss +14 -0
  453. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +111 -0
  454. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.scss +6 -0
  455. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.tsx +139 -0
  456. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.scss +20 -0
  457. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.tsx +254 -0
  458. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.scss +0 -0
  459. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.tsx +80 -0
  460. package/src/billing/dashboard/v3/preauth/preauth-attachments.component.tsx +389 -0
  461. package/src/billing/dashboard/v3/preauth/preauth-list.component.scss +34 -0
  462. package/src/billing/dashboard/v3/preauth/preauth-list.component.tsx +281 -0
  463. package/src/billing/dashboard/v3/preauth/preauth-status-tag.component.tsx +75 -0
  464. package/src/billing/dashboard/v3/preauth/preauth-typed-fields.md +125 -0
  465. package/src/billing/dashboard/v3/preauth/preauth.resource.ts +1072 -0
  466. package/src/billing/dashboard/v3/preauth/preauth.workspace.scss +91 -0
  467. package/src/billing/dashboard/v3/preauth/preauth.workspace.tsx +1806 -0
  468. package/src/billing/dashboard/v3/preauth/preauthorizations-tab.component.tsx +45 -0
  469. package/src/billing/dashboard/v3/shared/empty-state.component.scss +25 -0
  470. package/src/billing/dashboard/v3/shared/empty-state.component.tsx +13 -0
  471. package/src/billing/dashboard/v3/shared/table-toolbar.component.scss +64 -0
  472. package/src/billing/dashboard/v3/shared/table-toolbar.component.tsx +48 -0
  473. package/src/billing/dashboard/v3/types/index.ts +381 -0
  474. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.extension.tsx +55 -0
  475. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.scss +16 -0
  476. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  477. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +509 -0
  478. package/src/billing/invoice/bill.resource.ts +47 -0
  479. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  480. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  481. package/src/billing/invoice/invoice.scss +113 -0
  482. package/src/billing/invoice/invoice.tsx +1441 -0
  483. package/src/billing/invoice/line-items/line-items.scss +0 -0
  484. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  485. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  486. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  487. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  488. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  489. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  490. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  491. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  492. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  493. package/src/billing/maternity-discharge.resource.ts +21 -0
  494. package/src/billing/types/index.ts +354 -0
  495. package/src/billing/utils/index.ts +17 -0
  496. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  497. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  498. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +130 -0
  499. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  500. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +645 -0
  501. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +12 -0
  502. package/src/bookings/bookings.component.scss +7 -0
  503. package/src/bookings/bookings.component.tsx +35 -0
  504. package/src/bookings/daily/daily-bookings.resource.ts +2 -1
  505. package/src/case-summary/case-summary.extension.scss +13 -0
  506. package/src/case-summary/case-summary.extension.tsx +40 -0
  507. package/src/case-summary/case-summary.resource.test.ts +69 -0
  508. package/src/case-summary/case-summary.resource.ts +52 -0
  509. package/src/case-summary/components/case-summary-printable.component.scss +174 -0
  510. package/src/case-summary/components/case-summary-printable.component.tsx +288 -0
  511. package/src/case-summary/components/case-summary-printable.utils.ts +51 -0
  512. package/src/case-summary/types/case-summary.types.ts +152 -0
  513. package/src/claims/claims.component.scss +70 -0
  514. package/src/claims/claims.component.tsx +713 -0
  515. package/src/claims/claims.resource.ts +1274 -0
  516. package/src/claims/index.ts +340 -0
  517. package/src/claims/interventions.resource.ts +131 -0
  518. package/src/claims/utils.ts +64 -0
  519. package/src/config-schema.ts +114 -1
  520. package/src/context/patient-context.tsx +27 -0
  521. package/src/createDashboardLink.tsx +9 -0
  522. package/src/dashboard/charts/chart.component.scss +24 -0
  523. package/src/dashboard/charts/chart.component.tsx +56 -0
  524. package/src/dashboard/dashboard.component.scss +48 -3
  525. package/src/dashboard/dashboard.component.tsx +26 -36
  526. package/src/dashboard/overview/overview.component.scss +40 -59
  527. package/src/dashboard/overview/overview.component.tsx +53 -41
  528. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  529. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  530. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  531. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  532. package/src/dashboard-meta/case-summary.meta.ts +6 -0
  533. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  534. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  535. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  536. package/src/dashboard-meta/maternity-dashboard.meta.ts +6 -0
  537. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  538. package/src/dashboard-meta/pharmacy-dashboard.meta.ts +6 -0
  539. package/src/dashboard-meta/queue-dashboard.meta.ts +6 -0
  540. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  541. package/src/dashboard-meta/registry-dashboard.meta.ts +6 -0
  542. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  543. package/src/dashboard-meta/specialized-clinics-dashboard.meta.ts +6 -0
  544. package/src/dashboard-meta/triage-dashboard.meta.ts +6 -0
  545. package/src/index.ts +177 -6
  546. package/src/mnch/maternity/maternity-queues.component.scss +7 -0
  547. package/src/mnch/maternity/maternity-queues.component.tsx +32 -0
  548. package/src/mnch/maternity/queues/triage/maternity-triage.tsx +15 -0
  549. package/src/mnch/mch/mch-queues.component.scss +10 -0
  550. package/src/mnch/mch/mch-queues.component.tsx +36 -0
  551. package/src/mnch/mch/queues/consultation/mch-consultation.tsx +18 -0
  552. package/src/mnch/mch/queues/triage/mch-triage.tsx +15 -0
  553. package/src/mnch/mnch-root.tsx +17 -0
  554. package/src/mortuary/mortuary.component.tsx +13 -0
  555. package/src/pharmacy/pharmacy.component.scss +16 -0
  556. package/src/pharmacy/pharmacy.component.tsx +11 -6
  557. package/src/registers/registers.component.tsx +8 -0
  558. package/src/registry/drawer/emr-compare.component.scss +263 -0
  559. package/src/registry/drawer/emr-compare.component.tsx +302 -0
  560. package/src/registry/drawer/emr-compare.resource.ts +181 -0
  561. package/src/registry/drawer/emr-create-preview.component.tsx +123 -0
  562. package/src/registry/drawer/otp-verification-step.component.tsx +398 -0
  563. package/src/registry/drawer/pomsf-balance.util.test.ts +177 -0
  564. package/src/registry/drawer/pomsf-balance.util.ts +79 -0
  565. package/src/registry/drawer/verification.resource.ts +60 -0
  566. package/src/registry/drawer/workflow-drawer.component.scss +1242 -0
  567. package/src/registry/drawer/workflow-drawer.component.tsx +1476 -0
  568. package/src/registry/eligibility/eligibility-details/eligibility-details.scss +38 -0
  569. package/src/registry/eligibility/eligibility-details/eligibility-details.tsx +101 -0
  570. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +16 -0
  571. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +120 -0
  572. package/src/registry/eligibility/modal/eligibility-details.modal.scss +0 -0
  573. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +45 -0
  574. package/src/registry/hie.resource.ts +408 -0
  575. package/src/registry/hie.types.ts +57 -0
  576. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.scss +277 -0
  577. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.tsx +218 -0
  578. package/src/registry/modal/biometrics-verification-modal/type.ts +39 -0
  579. package/src/registry/modal/client-details-modal/client-details-modal.tsx +65 -29
  580. package/src/registry/modal/otp-modal/otp-whitlisting-modal.component.tsx +815 -0
  581. package/src/registry/modal/otp-modal/otp-whitlisting-modal.scss +354 -0
  582. package/src/registry/modal/otp-modal/otp-whitlisting.scss +0 -0
  583. package/src/registry/modal/otp-verification-modal/claims-consent.scss +72 -0
  584. package/src/registry/modal/otp-verification-modal/claims-consent.tsx +135 -0
  585. package/src/registry/modal/otp-verification-modal/extension/claims-consent.extension.tsx +124 -0
  586. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +30 -0
  587. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +154 -54
  588. package/src/registry/modal/send-to-triage/payment-details.tsx +120 -0
  589. package/src/registry/modal/send-to-triage/payment-method.component.tsx +54 -0
  590. package/src/registry/modal/send-to-triage/send-to-queue.modal.tsx +980 -0
  591. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +156 -3
  592. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +1101 -131
  593. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.scss +34 -0
  594. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.tsx +231 -0
  595. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  596. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  597. package/src/registry/registration-list/registration-list.component.scss +32 -0
  598. package/src/registry/registration-list/registration-list.component.tsx +103 -0
  599. package/src/registry/registry-entry.tsx +11 -0
  600. package/src/registry/registry.component.scss +402 -78
  601. package/src/registry/registry.component.tsx +547 -221
  602. package/src/registry/registry.resource.ts +22 -3
  603. package/src/registry/types/index.ts +117 -8
  604. package/src/registry/utils/error-handler.ts +54 -0
  605. package/src/registry/utils/format-dependant-display-data.ts +1 -1
  606. package/src/registry/utils/hie-client-adapter.ts +6 -3
  607. package/src/registry/utils/mask-data.ts +40 -0
  608. package/src/registry/utils/phone-number-formatter.ts +11 -0
  609. package/src/resources/dashboard.resource.ts +20 -0
  610. package/src/resources/identifier-types.ts +2 -0
  611. package/src/resources/patient-resource.ts +6 -1
  612. package/src/resources/queue.resource.ts +24 -1
  613. package/src/resources/superset.resource.ts +21 -0
  614. package/src/resources/visit.resource.ts +19 -1
  615. package/src/root.component.tsx +8 -5
  616. package/src/routes.json +417 -23
  617. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  618. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +153 -0
  619. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  620. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +182 -0
  621. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  622. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  623. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  624. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  625. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  626. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  627. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  628. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  629. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  630. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  631. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  632. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +34 -0
  633. package/src/service-queues/consultation/consultation.component.tsx +9 -0
  634. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  635. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  636. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  637. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +110 -0
  638. package/src/service-queues/modals/move/move-patient.component.scss +1 -1
  639. package/src/service-queues/modals/move/move-patient.component.tsx +31 -17
  640. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  641. package/src/service-queues/queue-list/queue-list.component.scss +37 -0
  642. package/src/service-queues/queue-list/queue-list.component.tsx +256 -56
  643. package/src/service-queues/service-queue/service-queue.component.tsx +151 -8
  644. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +5 -0
  645. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +36 -7
  646. package/src/service-queues/service-queue.tsx +22 -16
  647. package/src/service-queues/service-queues.resource.ts +197 -1
  648. package/src/service-queues/service.resource.ts +1 -1
  649. package/src/shared/constants/concepts.ts +50 -0
  650. package/src/shared/constants/patient-category.ts +6 -0
  651. package/src/shared/constants/patient-type.ts +10 -0
  652. package/src/shared/constants/visit-types.ts +7 -0
  653. package/src/shared/services/billing.resource.ts +75 -0
  654. package/src/shared/services/claims.resource.ts +47 -0
  655. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  656. package/src/shared/services/client-payment.resource.ts +17 -0
  657. package/src/shared/services/consultation-clearance.resource.ts +210 -0
  658. package/src/shared/services/eligibility.resource.ts +20 -0
  659. package/src/shared/services/encounters.resource.ts +33 -0
  660. package/src/shared/services/location.resource.ts +9 -0
  661. package/src/shared/types/index.ts +156 -0
  662. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  663. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  664. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  665. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  666. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.scss +39 -0
  667. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.tsx +19 -0
  668. package/src/shared/ui/otp-input/otp-input.component.scss +14 -0
  669. package/src/shared/ui/otp-input/otp-input.component.tsx +97 -0
  670. package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.tsx +6 -3
  671. package/src/shared/ui/timer/timer.component.scss +5 -0
  672. package/src/shared/ui/timer/timer.component.tsx +40 -0
  673. package/src/shared/utils/get-base-url.ts +10 -0
  674. package/src/shared/utils/get-tag-type.ts +75 -0
  675. package/src/side-nav-menu/mnch-nav-link-config.ts +16 -0
  676. package/src/side-nav-menu/mnch-nav-links.tsx +42 -0
  677. package/src/side-nav-menu/nav-link-config.ts +1 -5
  678. package/src/side-nav-menu/specialized-clinics-nav-link-config.ts +36 -0
  679. package/src/side-nav-menu/specialized-clinics-nav-links.tsx +42 -0
  680. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.scss +7 -0
  681. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.tsx +36 -0
  682. package/src/specialized-clinics/critital-care-unit/queues/consultation/critical-care-unit-consultation.tsx +15 -0
  683. package/src/specialized-clinics/critital-care-unit/queues/triage/critical-care-unit-triage.tsx +15 -0
  684. package/src/specialized-clinics/dental/dental-queues.component.scss +7 -0
  685. package/src/specialized-clinics/dental/dental-queues.component.tsx +36 -0
  686. package/src/specialized-clinics/dental/queues/consultation/dental-consultation.tsx +15 -0
  687. package/src/specialized-clinics/dental/queues/triage/dental-triage.tsx +15 -0
  688. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.scss +7 -0
  689. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.tsx +36 -0
  690. package/src/specialized-clinics/diagnostic-and-imaging/queues/consultation/diagnosis-and-imaging-consultation.tsx +15 -0
  691. package/src/specialized-clinics/diagnostic-and-imaging/queues/triage/diagnosis-and-imaging-triage.tsx +15 -0
  692. package/src/specialized-clinics/oncology/oncology-queues.component.scss +7 -0
  693. package/src/specialized-clinics/oncology/oncology-queues.component.tsx +36 -0
  694. package/src/specialized-clinics/oncology/queues/consultation/oncology-consultation.tsx +15 -0
  695. package/src/specialized-clinics/oncology/queues/triage/oncology-triage.tsx +15 -0
  696. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.scss +7 -0
  697. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.tsx +36 -0
  698. package/src/specialized-clinics/ophthalmology/queues/consultation/ophthalmology-consultation.tsx +15 -0
  699. package/src/specialized-clinics/ophthalmology/queues/triage/ophthalmology-triage.tsx +15 -0
  700. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.scss +7 -0
  701. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.tsx +36 -0
  702. package/src/specialized-clinics/psychiatry/queues/consultation/psychiatry-consultation.tsx +15 -0
  703. package/src/specialized-clinics/psychiatry/queues/triage/psychiatry-triage.tsx +15 -0
  704. package/src/specialized-clinics/renal/queues/consultation/dialysis-consultation.tsx +15 -0
  705. package/src/specialized-clinics/renal/queues/triage/renal-triage.tsx +15 -0
  706. package/src/specialized-clinics/renal/renal-queues.component.scss +7 -0
  707. package/src/specialized-clinics/renal/renal-queues.component.tsx +36 -0
  708. package/src/specialized-clinics/specialized-clinics-root.tsx +27 -0
  709. package/src/triage/triage.component.scss +6 -0
  710. package/src/triage/triage.component.tsx +4 -0
  711. package/src/types/types.ts +56 -1
  712. package/webpack.config.js +54 -1
  713. package/dist/104.js +0 -2
  714. package/dist/104.js.map +0 -1
  715. package/dist/15.js +0 -1
  716. package/dist/15.js.map +0 -1
  717. package/dist/184.js +0 -2
  718. package/dist/184.js.map +0 -1
  719. package/dist/197.js +0 -1
  720. package/dist/255.js +0 -1
  721. package/dist/255.js.map +0 -1
  722. package/dist/300.js +0 -1
  723. package/dist/335.js +0 -1
  724. package/dist/339.js +0 -1
  725. package/dist/339.js.map +0 -1
  726. package/dist/353.js +0 -1
  727. package/dist/353.js.map +0 -1
  728. package/dist/420.js +0 -1
  729. package/dist/420.js.map +0 -1
  730. package/dist/540.js +0 -2
  731. package/dist/540.js.map +0 -1
  732. package/dist/55.js +0 -1
  733. package/dist/652.js +0 -1
  734. package/dist/709.js +0 -1
  735. package/dist/709.js.map +0 -1
  736. package/dist/710.js +0 -2
  737. package/dist/710.js.map +0 -1
  738. package/dist/729.js +0 -1
  739. package/dist/729.js.map +0 -1
  740. package/dist/752.js +0 -1
  741. package/dist/752.js.map +0 -1
  742. package/dist/833.js +0 -1
  743. package/dist/833.js.map +0 -1
  744. package/dist/907.js +0 -1
  745. package/dist/907.js.map +0 -1
  746. package/dist/91.js +0 -1
  747. package/dist/91.js.map +0 -1
  748. package/dist/93.js +0 -1
  749. package/dist/93.js.map +0 -1
  750. package/dist/943.js +0 -1
  751. package/dist/943.js.map +0 -1
  752. package/dist/99.js +0 -1
  753. /package/dist/{104.js.LICENSE.txt → 2177.js.LICENSE.txt} +0 -0
  754. /package/dist/{810.js.LICENSE.txt → 262.js.LICENSE.txt} +0 -0
  755. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  756. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
  757. /package/dist/{710.js.LICENSE.txt → 7830.js.LICENSE.txt} +0 -0
  758. /package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.scss +0 -0
@@ -0,0 +1,900 @@
1
+ import { openmrsFetch, restBaseUrl, useConfig } from '@openmrs/esm-framework';
2
+ import { getEtlBaseUrl } from '../shared/utils/get-base-url';
3
+ import {
4
+ type FacilityBillsResponse,
5
+ type FacilityBillsDto,
6
+ type FacilityBill,
7
+ type PatientFacilityBillsDto,
8
+ type PatientFacilityBillDetailsResponse,
9
+ type PatientFacilityBillDetails,
10
+ type ClaimVisitsDto,
11
+ type ClaimVisitReponse,
12
+ type ProviderClaimPreviewDto,
13
+ type ClaimsVisit,
14
+ type PatientPaymentsDto,
15
+ type PatientPaymentReponse,
16
+ type PatientPayment,
17
+ type BillPaymentDto,
18
+ type BillPaymentResponse,
19
+ type AddClaimLineDto,
20
+ type CloseClaimDto,
21
+ type SubmitClaimDto,
22
+ type AddClaimDiagnosisDto,
23
+ type RemoveClaimLineDto,
24
+ type SwitchInterventionDto,
25
+ type PatientBill,
26
+ type PendingBillLineItems,
27
+ } from './dashboard/v2/types';
28
+ import { getHieBaseUrl } from '../claims/utils';
29
+ import {
30
+ type FacilityPreauthsResponse,
31
+ type AmrsMaternityDiagnosis,
32
+ type AmrsMaternityDiagnosisDto,
33
+ type AmrsMaternityDiagnosisResponse,
34
+ type AmrsVisitDiagnosis,
35
+ type AmrsVisitDiagnosisDto,
36
+ type AmrsVisitDiagnosisResponse,
37
+ type BedOccupancy,
38
+ PayerPreviewResponse,
39
+ PayerPreviewResult,
40
+ } from './types';
41
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
42
+ import useSWR, { mutate } from 'swr';
43
+ import { VisitSummaryResponse } from './dashboard/v3/patient-bill-details/attachments/type';
44
+
45
+ export async function fetchFacilityBills(facilityBillsDto: FacilityBillsDto): Promise<PatientBill[]> {
46
+ const etlBaseUrl = await getEtlBaseUrl();
47
+ const facilityBillsUrl = `${etlBaseUrl}/facility/facility-bills?locationUuid=${facilityBillsDto.locationUuid}&billingDate=${facilityBillsDto.billingDate}`;
48
+ const response = await openmrsFetch(facilityBillsUrl);
49
+ const data = await response.json();
50
+ return (data.results ?? []).map((bill: any) => ({
51
+ ...bill,
52
+ bill_items: typeof bill.bill_items === 'string' ? JSON.parse(bill.bill_items) : bill.bill_items,
53
+ payments: typeof bill.payments === 'string' ? JSON.parse(bill.payments) : bill.payments,
54
+ }));
55
+ }
56
+
57
+ export async function fetchPatientFacilityBillDetails(
58
+ patientFacilityBillsDto: PatientFacilityBillsDto,
59
+ ): Promise<PatientFacilityBillDetails[]> {
60
+ const etlBaseUrl = await getEtlBaseUrl();
61
+ const patientfacilityBillDetailsUrl = `${etlBaseUrl}/facility/patient/bill?locationUuid=${patientFacilityBillsDto.locationUuid}&billingDate=${patientFacilityBillsDto.billingDate}&patientUuid=${patientFacilityBillsDto.patientUuid}`;
62
+ const response = await openmrsFetch(patientfacilityBillDetailsUrl);
63
+ const data = (await response.json()) as PatientFacilityBillDetailsResponse;
64
+ return data.results ?? [];
65
+ }
66
+
67
+ /** Bill lines that need normal preauth for the facility/date (ETL pre-filters). */
68
+ export async function fetchFacilityPreauthBills(
69
+ facilityBillsDto: FacilityBillsDto,
70
+ ): Promise<PatientFacilityBillDetails[]> {
71
+ const etlBaseUrl = await getEtlBaseUrl();
72
+ const url = `${etlBaseUrl}/facility/pre-auth-bills?locationUuid=${facilityBillsDto.locationUuid}&billingDate=${facilityBillsDto.billingDate}`;
73
+ const response = await openmrsFetch(url);
74
+ const data = await response.json();
75
+ if (Array.isArray(data)) {
76
+ return data as PatientFacilityBillDetails[];
77
+ }
78
+ return (data as PatientFacilityBillDetailsResponse)?.results ?? [];
79
+ }
80
+
81
+ export async function fetchFacilityClaimVisits(claimVisitsDto: ClaimVisitsDto): Promise<ClaimVisitReponse[]> {
82
+ const claimVisitsFilter: ClaimVisitsDto = {};
83
+ if (claimVisitsDto.consentToken) {
84
+ claimVisitsFilter['consentToken'] = claimVisitsDto.consentToken;
85
+ }
86
+ if (claimVisitsDto.locationUuid) {
87
+ claimVisitsFilter['locationUuid'] = claimVisitsDto.locationUuid;
88
+ }
89
+ if (claimVisitsDto.visitDate) {
90
+ claimVisitsFilter['visitDate'] = claimVisitsDto.visitDate;
91
+ }
92
+ const { hieBaseUrl } = await getHieBaseUrl();
93
+ const queryString = new URLSearchParams(claimVisitsFilter).toString();
94
+ const response = await openmrsFetch(`${hieBaseUrl}/claims-visit?${queryString}`);
95
+ const data = (await response.json()) as ClaimVisitReponse[];
96
+ return data ?? [];
97
+ }
98
+
99
+ /** The authorization guid a claim visit is addressed by, from either half of the record. */
100
+ export function claimVisitGuid(claimVisit: ClaimVisitReponse): string {
101
+ return (claimVisit?.authorizationGuid || claimVisit?.visitResponse?.authorization_guid || '').trim();
102
+ }
103
+
104
+ /**
105
+ * Find a claim visit by its authorization guid — the id the claim is addressed by in the
106
+ * URL. /claims-visit has no guid filter, so this narrows by location and matches the guid
107
+ * client-side: first within the date being read (one small response, and the case that
108
+ * comes up when a page is reloaded), then across the location when that misses, which is
109
+ * what makes a link to an older claim work at all.
110
+ *
111
+ * Returns null when nothing matches, including when the wider query fails — a claim that
112
+ * can't be found is the same outcome either way.
113
+ */
114
+ export async function findClaimVisitByGuid(
115
+ guid: string,
116
+ locationUuid: string,
117
+ visitDate?: string,
118
+ ): Promise<ClaimVisitReponse | null> {
119
+ const wanted = (guid ?? '').trim().toLowerCase();
120
+ if (!wanted || !locationUuid) {
121
+ return null;
122
+ }
123
+ const matchIn = (visits: ClaimVisitReponse[]) =>
124
+ (visits ?? []).find((cv) => claimVisitGuid(cv).toLowerCase() === wanted) ?? null;
125
+
126
+ if (visitDate) {
127
+ try {
128
+ const sameDay = matchIn(await fetchFacilityClaimVisits({ locationUuid, visitDate }));
129
+ if (sameDay) {
130
+ return sameDay;
131
+ }
132
+ } catch {
133
+ // Fall through to the wider query rather than give up on the narrow one failing.
134
+ }
135
+ }
136
+ try {
137
+ return matchIn(await fetchFacilityClaimVisits({ locationUuid }));
138
+ } catch {
139
+ return null;
140
+ }
141
+ }
142
+
143
+ export async function fetchProviderClaimPreview(
144
+ providerClaimPreviewDto: ProviderClaimPreviewDto,
145
+ ): Promise<ClaimsVisit> {
146
+ const { hieBaseUrl } = await getHieBaseUrl();
147
+ const providerClaimPreviewUrl = `${hieBaseUrl}/claim-preview/provider`;
148
+ const response = await openmrsFetch(providerClaimPreviewUrl, {
149
+ method: 'POST',
150
+ headers: {
151
+ 'content-type': 'application/json',
152
+ },
153
+ body: JSON.stringify(providerClaimPreviewDto),
154
+ });
155
+ const data = (await response.json()) as ClaimsVisit;
156
+ return data ?? null;
157
+ }
158
+
159
+ // Fields only a real claim carries; used to tell the claim object apart from any
160
+ // wrapper the endpoint might nest it under.
161
+ const CLAIM_SIGNATURE_KEYS = ['authorization_code', 'workflow_state', 'scheme_code', 'invoices', 'interventions'];
162
+
163
+ // The claim-preview endpoint has returned the claim both flat and wrapped (under
164
+ // `data` / `results` / `visitResponse`) across API versions. Peel common single-key
165
+ // wrappers until we reach the object that actually carries the claim fields, so the
166
+ // Claim Details never render blank against a truthy-but-wrapped payload.
167
+ function unwrapClaimVisit(body: unknown): ClaimsVisit | undefined {
168
+ let node: any = body;
169
+ for (let depth = 0; node && typeof node === 'object' && depth < 4; depth++) {
170
+ if (CLAIM_SIGNATURE_KEYS.some((key) => key in node)) {
171
+ return node as ClaimsVisit;
172
+ }
173
+ node = node.visitResponse ?? node.data ?? node.results ?? undefined;
174
+ }
175
+ return (node as ClaimsVisit) ?? undefined;
176
+ }
177
+
178
+ export function useProviderClaimPreview(consentToken: string, locationUuid: string) {
179
+ const { hieBaseUrl } = useConfig({
180
+ externalModuleName: '@ampath/esm-dha-workflow-app',
181
+ });
182
+ const url = consentToken
183
+ ? `${hieBaseUrl}/claim-preview/provider?consentToken=${consentToken}&locationUuid=${locationUuid}`
184
+ : null;
185
+
186
+ const { data, error, isLoading, isValidating } = useSWR(url, openmrsFetch, {
187
+ keepPreviousData: true,
188
+ // This preview is an expensive round trip to the HIE, so it is fetched only when
189
+ // something actually asks for it: the first load of a claim, a mutation that
190
+ // invalidates it, or the Refresh control on Claim Details. Every one of SWR's
191
+ // automatic triggers is off — window focus, reconnect, and the revalidation it
192
+ // would otherwise run whenever a component remounts over cached data.
193
+ //
194
+ // The trade-off is that a claim changed elsewhere won't appear here until someone
195
+ // refreshes; that is the intent, and the timestamp beside the Refresh control says
196
+ // how old what you are looking at is.
197
+ // `revalidateOnMount` is deliberately left unset: SWR then fetches when there is no
198
+ // cached claim yet — so opening one for the first time still loads it — and skips
199
+ // the fetch when the cache already holds it. Forcing it true would re-fetch on
200
+ // every remount and undo the line above.
201
+ revalidateOnFocus: false,
202
+ revalidateOnReconnect: false,
203
+ revalidateIfStale: false,
204
+ });
205
+
206
+ const results = unwrapClaimVisit(data?.data);
207
+
208
+ return {
209
+ claimVisit: results,
210
+ error,
211
+ isLoading,
212
+ isValidating,
213
+ };
214
+ }
215
+
216
+ /**
217
+ * Announced whenever the claim has been mutated (a diagnosis or claim line added, an
218
+ * attachment sent, an intervention switched…).
219
+ *
220
+ * Every one of those call sites already invalidates the SWR-backed claim preview. The
221
+ * claims-visit endpoint is fetched imperatively rather than through SWR, so there is no
222
+ * cache to invalidate — this event is how anything holding that response knows to go
223
+ * and refetch it. See PatientClaimDetails.
224
+ */
225
+ export const CLAIM_CHANGED_EVENT = 'ampath:claim-changed';
226
+
227
+ export function useInvalidateProviderClaimPreview() {
228
+ const { hieBaseUrl } = useConfig({
229
+ externalModuleName: '@ampath/esm-dha-workflow-app',
230
+ });
231
+ return useCallback(() => {
232
+ const url = `${hieBaseUrl}/claim-preview/provider`;
233
+ mutate((key) => typeof key === 'string' && key.startsWith(`${url}`), undefined, { revalidate: true });
234
+ window.dispatchEvent(new CustomEvent(CLAIM_CHANGED_EVENT));
235
+ }, [hieBaseUrl]);
236
+ }
237
+
238
+ /**
239
+ * The claims filed at a facility on a date, reloaded whenever one is mutated.
240
+ *
241
+ * Everything that lists claims — the bills table, the dashboard tiles — reads this same
242
+ * shape, so they can't disagree about which claims exist.
243
+ */
244
+ export function useFacilityClaimVisits(locationUuid: string, visitDate: string) {
245
+ const [claimVisits, setClaimVisits] = useState<ClaimVisitReponse[]>([]);
246
+ const [loading, setLoading] = useState<boolean>(true);
247
+
248
+ const load = useCallback(() => {
249
+ if (!locationUuid || !visitDate) {
250
+ setClaimVisits([]);
251
+ setLoading(false);
252
+ return;
253
+ }
254
+ setLoading(true);
255
+ fetchFacilityClaimVisits({ locationUuid, visitDate })
256
+ .then((data) => setClaimVisits(data ?? []))
257
+ .catch(() => setClaimVisits([]))
258
+ .finally(() => setLoading(false));
259
+ }, [locationUuid, visitDate]);
260
+
261
+ useEffect(() => {
262
+ load();
263
+ }, [load]);
264
+
265
+ useClaimChanged(load);
266
+
267
+ return { claimVisits, loading, reload: load };
268
+ }
269
+
270
+ /** The consent token a claim visit is identified by on the claims endpoints. */
271
+ export function claimVisitToken(claimVisit: ClaimVisitReponse): string {
272
+ return (claimVisit?.authorizationCode || claimVisit?.visitResponse?.authorization_code || '').trim();
273
+ }
274
+
275
+ /** One claim's live state, fetched outside SWR so many can be resolved at once. */
276
+ async function fetchProviderClaimState(consentToken: string, locationUuid: string): Promise<string | undefined> {
277
+ const { hieBaseUrl } = await getHieBaseUrl();
278
+ const url = `${hieBaseUrl}/claim-preview/provider?consentToken=${encodeURIComponent(
279
+ consentToken,
280
+ )}&locationUuid=${encodeURIComponent(locationUuid)}`;
281
+ const response = await openmrsFetch(url);
282
+ const claim = unwrapClaimVisit(await response.json());
283
+ const state = (claim?.workflow_state ?? '').trim();
284
+ return state || undefined;
285
+ }
286
+
287
+ // How many claim previews are in flight at once. Each is a round trip to the HIE that
288
+ // has been seen to take several seconds, so they overlap — but not so many that opening
289
+ // a busy day's bills buries the HIE in requests.
290
+ const CLAIM_STATE_CONCURRENCY = 4;
291
+
292
+ /**
293
+ * States resolved so far this page-load, shared by everything that shows them — the
294
+ * dashboard tiles and the bills table would otherwise each pay for the same slow preview
295
+ * of the same claim, and could disagree about it. Entries are dropped when the claim is
296
+ * mutated (see `load(force)`), so this never serves a state the user has just changed.
297
+ */
298
+ const claimStateCache = new Map<string, string>();
299
+ const claimStateInFlight = new Map<string, Promise<string | undefined>>();
300
+ const claimStateKey = (locationUuid: string, consentToken: string) => `${locationUuid}|${consentToken}`;
301
+
302
+ function resolveClaimState(consentToken: string, locationUuid: string): Promise<string | undefined> {
303
+ const key = claimStateKey(locationUuid, consentToken);
304
+ const cached = claimStateCache.get(key);
305
+ if (cached) {
306
+ return Promise.resolve(cached);
307
+ }
308
+ // Two lists asking for the same claim at once share one request rather than racing.
309
+ const inFlight = claimStateInFlight.get(key);
310
+ if (inFlight) {
311
+ return inFlight;
312
+ }
313
+ const request = fetchProviderClaimState(consentToken, locationUuid)
314
+ .then((state) => {
315
+ if (state) {
316
+ claimStateCache.set(key, state);
317
+ }
318
+ return state;
319
+ })
320
+ .finally(() => {
321
+ if (claimStateInFlight.get(key) === request) {
322
+ claimStateInFlight.delete(key);
323
+ }
324
+ });
325
+ claimStateInFlight.set(key, request);
326
+ return request;
327
+ }
328
+
329
+ async function runWithConcurrency<T>(items: T[], limit: number, worker: (item: T) => Promise<void>): Promise<void> {
330
+ const queue = [...items];
331
+ const runners = Array.from({ length: Math.min(limit, queue.length) }, async () => {
332
+ for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
333
+ await worker(next);
334
+ }
335
+ });
336
+ await Promise.all(runners);
337
+ }
338
+
339
+ /**
340
+ * The live `workflow_state` of each claim, keyed by consent token.
341
+ *
342
+ * /claims-visit returns the copy of the claim that was stored when the visit was
343
+ * recorded, so its `workflow_state` is whatever the claim was *then* — a claim submitted
344
+ * afterwards still reads DRAFT there. claim-preview/provider is the live view, which is
345
+ * why Claim Details opens on DRAFT and corrects itself to the real state a few seconds
346
+ * later, once the preview lands.
347
+ *
348
+ * A list of claims therefore can't trust the state it was handed. There is no bulk
349
+ * status feed, so the preview is fetched per claim, a few at a time, and each row is
350
+ * upgraded as its answer arrives. Claims whose preview fails keep the stored state —
351
+ * `failed` says how many, so the caller can admit that rather than present a stale
352
+ * status as current.
353
+ */
354
+ export function useLiveClaimStates(consentTokens: string[], locationUuid: string, enabled = true) {
355
+ const [states, setStates] = useState<Record<string, string>>({});
356
+ const [resolving, setResolving] = useState<boolean>(false);
357
+ const [failed, setFailed] = useState<number>(0);
358
+ // The claim set a run has finished for. Compared against the current one to answer
359
+ // "are these states final?" — `resolving` alone can't, since it is still false in the
360
+ // render between the claims arriving and the first run starting.
361
+ const [settledKey, setSettledKey] = useState<string>('');
362
+ // Deduped and sorted, so this re-runs when the set of claims genuinely changes rather
363
+ // than on every render that rebuilds the array.
364
+ const tokenKey = useMemo(
365
+ () =>
366
+ Array.from(new Set((consentTokens ?? []).map((token) => (token ?? '').trim()).filter(Boolean)))
367
+ .sort()
368
+ .join('|'),
369
+ [consentTokens],
370
+ );
371
+ // Only the newest run may write: a date changed mid-flight would otherwise have the
372
+ // previous day's answers land on top of the current one's.
373
+ const runSeq = useRef(0);
374
+ // Mirrors settledKey for `load` to read without depending on it.
375
+ const settledKeyRef = useRef('');
376
+
377
+ const load = useCallback(
378
+ (force = false) => {
379
+ const tokens = tokenKey ? tokenKey.split('|') : [];
380
+ if (!enabled || !locationUuid || tokens.length === 0) {
381
+ return;
382
+ }
383
+ // These claims have already been resolved and nothing has happened to them since.
384
+ // Without this, leaving the tab and coming back would re-run every request and put
385
+ // the caller back behind a loading state for states it already has.
386
+ if (!force && settledKeyRef.current === tokenKey) {
387
+ return;
388
+ }
389
+ const seq = ++runSeq.current;
390
+ setResolving(true);
391
+ setFailed(0);
392
+ settledKeyRef.current = '';
393
+ setSettledKey('');
394
+ // A forced run is one asking past what was already resolved — a claim has been
395
+ // submitted or closed — so the shared cache gives up its answers for these claims.
396
+ if (force) {
397
+ tokens.forEach((consentToken) => claimStateCache.delete(claimStateKey(locationUuid, consentToken)));
398
+ }
399
+ runWithConcurrency(tokens, CLAIM_STATE_CONCURRENCY, async (consentToken) => {
400
+ try {
401
+ const state = await resolveClaimState(consentToken, locationUuid);
402
+ if (seq === runSeq.current && state) {
403
+ setStates((prev) => (prev[consentToken] === state ? prev : { ...prev, [consentToken]: state }));
404
+ }
405
+ } catch {
406
+ if (seq === runSeq.current) {
407
+ setFailed((count) => count + 1);
408
+ }
409
+ }
410
+ }).finally(() => {
411
+ if (seq === runSeq.current) {
412
+ setResolving(false);
413
+ settledKeyRef.current = tokenKey;
414
+ setSettledKey(tokenKey);
415
+ }
416
+ });
417
+ },
418
+ [tokenKey, locationUuid, enabled],
419
+ );
420
+
421
+ useEffect(() => {
422
+ load();
423
+ }, [load]);
424
+
425
+ // Submitting or closing a claim changes the very state this is reporting, so that one
426
+ // refetches even though these claims were already resolved.
427
+ const reload = useCallback(() => load(true), [load]);
428
+ useClaimChanged(reload);
429
+
430
+ // Nothing to resolve counts as settled; otherwise the current claim set must be the
431
+ // one a run has finished for. A caller that shouldn't show half-resolved statuses can
432
+ // wait on this.
433
+ const settled = !enabled || tokenKey === '' || settledKey === tokenKey;
434
+
435
+ return { states, resolving, settled, failed, reload };
436
+ }
437
+
438
+ /** Run `onClaimChanged` whenever the claim is mutated anywhere in the page. */
439
+ export function useClaimChanged(onClaimChanged: () => void) {
440
+ const onClaimChangedRef = useRef(onClaimChanged);
441
+ onClaimChangedRef.current = onClaimChanged;
442
+
443
+ useEffect(() => {
444
+ const handler = () => onClaimChangedRef.current();
445
+ window.addEventListener(CLAIM_CHANGED_EVENT, handler);
446
+ return () => window.removeEventListener(CLAIM_CHANGED_EVENT, handler);
447
+ }, []);
448
+ }
449
+
450
+ export async function fetchPatientClaimVisit(claimVisitsDto: ClaimVisitsDto): Promise<ClaimVisitReponse[]> {
451
+ const claimVisitsFilter: ClaimVisitsDto = {};
452
+ if (claimVisitsDto.consentToken) {
453
+ claimVisitsFilter['consentToken'] = claimVisitsDto.consentToken;
454
+ }
455
+ if (claimVisitsDto.patientId) {
456
+ claimVisitsFilter['patientId'] = claimVisitsDto.patientId;
457
+ }
458
+ if (claimVisitsDto.locationUuid) {
459
+ claimVisitsFilter['locationUuid'] = claimVisitsDto.locationUuid;
460
+ }
461
+ if (claimVisitsDto.visitDate) {
462
+ claimVisitsFilter['visitDate'] = claimVisitsDto.visitDate;
463
+ }
464
+ const { hieBaseUrl } = await getHieBaseUrl();
465
+ const queryString = new URLSearchParams(claimVisitsFilter).toString();
466
+ const response = await openmrsFetch(`${hieBaseUrl}/claims-visit?${queryString}`);
467
+ const data = (await response.json()) as ClaimVisitReponse[];
468
+ return data ?? [];
469
+ }
470
+
471
+ export async function fetchPatientBillPayments(patientPaymentsDto: PatientPaymentsDto): Promise<PatientPayment[]> {
472
+ const etlBaseUrl = await getEtlBaseUrl();
473
+ const patientPaymentsUrl = `${etlBaseUrl}/bill/patient/payment?billingDate=${patientPaymentsDto.billingDate}&patientUuid=${patientPaymentsDto.patientUuid}`;
474
+ const response = await openmrsFetch(patientPaymentsUrl);
475
+ const data = (await response.json()) as PatientPaymentReponse;
476
+ return data.results ?? [];
477
+ }
478
+
479
+ export async function payBillItem(billUuid: string, billPaymentDto: BillPaymentDto) {
480
+ const billPaymentUrl = `${restBaseUrl}/billing/bill/${billUuid}/payment`;
481
+ const response = await openmrsFetch(billPaymentUrl, {
482
+ method: 'POST',
483
+ headers: {
484
+ 'content-type': 'application/json',
485
+ },
486
+ body: JSON.stringify(billPaymentDto),
487
+ });
488
+ const data = (await response.json()) as BillPaymentResponse;
489
+ return data ?? null;
490
+ }
491
+
492
+ export async function addClaimItem(addClaimLineDto: AddClaimLineDto) {
493
+ const { hieBaseUrl } = await getHieBaseUrl();
494
+ const addClaimLineUrl = `${hieBaseUrl}/claim-line`;
495
+ const result = await openmrsFetch(addClaimLineUrl, {
496
+ method: 'POST',
497
+ headers: {
498
+ 'content-type': 'application/json',
499
+ },
500
+ body: JSON.stringify(addClaimLineDto),
501
+ }).catch((error) => {
502
+ const message = error?.responseBody?.message ?? error?.message ?? '';
503
+ if (typeof message === 'object') {
504
+ throw `${message?.join(',')}`;
505
+ }
506
+ throw message || 'Failed to add claim line';
507
+ });
508
+
509
+ if (result?.data && 'error' in result.data && 'message' in result.data) {
510
+ const message = result.data.message ?? '';
511
+ throw typeof message === 'object' ? `${(message as string[]).join(',')}` : message;
512
+ }
513
+ return result?.data ?? null;
514
+ }
515
+
516
+ export async function removeClaimItem(removeClaimLineDto: RemoveClaimLineDto) {
517
+ const { hieBaseUrl } = await getHieBaseUrl();
518
+ const url = `${hieBaseUrl}/claim-line`;
519
+ const result = await openmrsFetch(url, {
520
+ method: 'DELETE',
521
+ headers: {
522
+ 'content-type': 'application/json',
523
+ },
524
+ body: JSON.stringify(removeClaimLineDto),
525
+ }).catch((error) => {
526
+ const message = error?.responseBody?.message ?? '';
527
+ if (typeof message === 'object') {
528
+ throw `${message?.join(',')}`;
529
+ }
530
+ throw message;
531
+ });
532
+
533
+ if (result?.data && 'error' in result.data && 'message' in result.data) {
534
+ const message = result.data.message ?? '';
535
+ throw message;
536
+ }
537
+ return result?.data;
538
+ }
539
+
540
+ // TODO(backend): the `${hieBaseUrl}/interventions/switch` route is not yet
541
+ // exposed by the HIE proxy. An equivalent switch lives on the DHA middleware
542
+ // (`/claims/interventions/switch`, see src/claims/interventions.resource.ts),
543
+ // but this posts the camelCase SwitchInterventionDto through the same OpenMRS
544
+ // proxy the other claim-line mutations use. Wire the backend route before this
545
+ // ships.
546
+ export async function switchClaimIntervention(switchInterventionDto: SwitchInterventionDto) {
547
+ const { hieBaseUrl } = await getHieBaseUrl();
548
+ const url = `${hieBaseUrl}/interventions/switch`;
549
+ const result = await openmrsFetch(url, {
550
+ method: 'POST',
551
+ headers: {
552
+ 'content-type': 'application/json',
553
+ },
554
+ body: JSON.stringify(switchInterventionDto),
555
+ }).catch((error) => {
556
+ const message = error?.responseBody?.message ?? '';
557
+ if (typeof message === 'object') {
558
+ throw `${message?.join(',')}`;
559
+ }
560
+ throw message;
561
+ });
562
+
563
+ if (result?.data && 'error' in result.data && 'message' in result.data) {
564
+ const message = result.data.message ?? '';
565
+ throw message;
566
+ }
567
+ return result?.data;
568
+ }
569
+
570
+ /** Retire (remove) an intervention from the claim visit.
571
+ * @see https://hie-docs.dha.go.ke/docs/claims/process/interventions/retireIntervention
572
+ */
573
+ export async function retireClaimIntervention(dto: {
574
+ consentToken: string;
575
+ interventionCode: string;
576
+ locationUuid: string;
577
+ }) {
578
+ const { hieBaseUrl } = await getHieBaseUrl();
579
+ const url = `${hieBaseUrl}/interventions/retire`;
580
+ const result = await openmrsFetch(url, {
581
+ method: 'POST',
582
+ headers: {
583
+ 'content-type': 'application/json',
584
+ },
585
+ body: JSON.stringify(dto),
586
+ }).catch((error) => {
587
+ const message = error?.responseBody?.message ?? error?.message ?? '';
588
+ if (typeof message === 'object') {
589
+ throw `${(message as string[]).join(',')}`;
590
+ }
591
+ throw message || 'Failed to remove intervention';
592
+ });
593
+
594
+ if (result?.data && 'error' in result.data && 'message' in result.data) {
595
+ const message = result.data.message ?? '';
596
+ throw typeof message === 'object' ? `${(message as string[]).join(',')}` : message;
597
+ }
598
+ return result?.data;
599
+ }
600
+
601
+ export async function closeClaim(closeClaimDto: CloseClaimDto) {
602
+ const { hieBaseUrl } = await getHieBaseUrl();
603
+ const addClaimLineUrl = `${hieBaseUrl}/claim-closure`;
604
+ const response = await openmrsFetch(addClaimLineUrl, {
605
+ method: 'POST',
606
+ headers: {
607
+ 'content-type': 'application/json',
608
+ },
609
+ body: JSON.stringify(closeClaimDto),
610
+ });
611
+ const data = (await response.json()) as ClaimVisitReponse;
612
+ return data ?? null;
613
+ }
614
+
615
+ export async function submitClaim(submitClaimDto: SubmitClaimDto, visitType: string = 'INPATIENT') {
616
+ const { hieBaseUrl } = await getHieBaseUrl();
617
+ let claimUrl = `${hieBaseUrl}/claim-submission`;
618
+ if (visitType === 'INPATIENT') {
619
+ submitClaimDto['dischargeDate'] = new Date().toISOString();
620
+ claimUrl = `${hieBaseUrl}/claim-submission/inpatient`;
621
+ }
622
+ const response = await openmrsFetch(claimUrl, {
623
+ method: 'POST',
624
+ headers: {
625
+ 'content-type': 'application/json',
626
+ },
627
+ body: JSON.stringify(submitClaimDto),
628
+ });
629
+ const data = (await response.json()) as ClaimVisitReponse;
630
+ return data ?? null;
631
+ }
632
+
633
+ export async function fetchPatientDiagnosis(
634
+ amrsVisitDiagnosisDto: AmrsVisitDiagnosisDto,
635
+ ): Promise<AmrsVisitDiagnosis[]> {
636
+ const etlBaseUrl = await getEtlBaseUrl();
637
+ const patientDiagnosisUrl = `${etlBaseUrl}/patient/diagnosis?visitDate=${amrsVisitDiagnosisDto.visitDate}&patientUuid=${amrsVisitDiagnosisDto.patientUuid}&locationUuid=${amrsVisitDiagnosisDto.locationUuid}`;
638
+ const response = await openmrsFetch(patientDiagnosisUrl);
639
+ const data = (await response.json()) as AmrsVisitDiagnosisResponse;
640
+ return data.results ?? [];
641
+ }
642
+
643
+ export async function fetchMaternityDiagnosis(
644
+ amrsMaternityDiagnosisDto: AmrsMaternityDiagnosisDto,
645
+ ): Promise<AmrsMaternityDiagnosis[]> {
646
+ const etlBaseUrl = await getEtlBaseUrl();
647
+ const patientDiagnosisUrl = `${etlBaseUrl}/maternity-diagnosis-doctor?patientUuid=${amrsMaternityDiagnosisDto.patientUuid}&billingDate=${amrsMaternityDiagnosisDto.billingDate}`;
648
+ const response = await openmrsFetch(patientDiagnosisUrl);
649
+ const data = (await response.json()) as AmrsMaternityDiagnosisResponse;
650
+ return data.results ?? [];
651
+ }
652
+
653
+ export async function addClaimDiagnosis(addClaimDiagnosisDto: AddClaimDiagnosisDto) {
654
+ const { hieBaseUrl } = await getHieBaseUrl();
655
+ const addClaimDiagnosisUrl = `${hieBaseUrl}/claim-diagnosis`;
656
+ const response = await openmrsFetch(addClaimDiagnosisUrl, {
657
+ method: 'POST',
658
+ headers: {
659
+ 'content-type': 'application/json',
660
+ },
661
+ body: JSON.stringify(addClaimDiagnosisDto),
662
+ });
663
+ const data = await response.json();
664
+ return data ?? null;
665
+ }
666
+
667
+ export const endVisit = async (visitUuid: string) => {
668
+ const url = `${restBaseUrl}/visit/${visitUuid}`;
669
+ const stopDatetime = new Date();
670
+ const body = {
671
+ stopDatetime,
672
+ };
673
+ const response = await openmrsFetch(url, {
674
+ method: 'POST',
675
+ headers: {
676
+ 'content-type': 'application/json',
677
+ },
678
+ body: JSON.stringify(body),
679
+ });
680
+
681
+ return response.json();
682
+ };
683
+
684
+ export const useFacilityPreauths = (locationUuid: string, billingDate: string) => {
685
+ const { etlBaseUrl } = useConfig({
686
+ externalModuleName: '@ampath/esm-dha-workflow-app',
687
+ });
688
+
689
+ const url = `${etlBaseUrl}/facility/pre-auth-bills?billingDate=${billingDate}&locationUuid=${locationUuid}`;
690
+ const { data, error, isLoading, isValidating } = useSWR<{
691
+ data: FacilityPreauthsResponse;
692
+ }>(url, openmrsFetch);
693
+
694
+ return {
695
+ facilityPreauths: data?.data?.results,
696
+ error,
697
+ isLoading,
698
+ isValidating,
699
+ };
700
+ };
701
+
702
+ export const getActiveCashVisits = async (locationUuid: string, billDate: string) => {
703
+ const etlBaseUrl = await getEtlBaseUrl();
704
+ const url = `${etlBaseUrl}/facility/active-cash-visits?locationUuid=${locationUuid}&billingDate=${billDate}`;
705
+
706
+ const response = await openmrsFetch(url);
707
+
708
+ return response.json();
709
+ };
710
+
711
+ export const getFacilityBillLineItems = async (
712
+ locationUuid: string,
713
+ billDate: string,
714
+ ): Promise<PendingBillLineItems[]> => {
715
+ const etlBaseUrl = await getEtlBaseUrl();
716
+ const url = `${etlBaseUrl}/facility/bill-line-item?locationUuid=${locationUuid}&billingDate=${billDate}`;
717
+
718
+ const response = await openmrsFetch(url);
719
+
720
+ const data = await response.json();
721
+
722
+ return (data.results ?? []).map((row: any) => ({
723
+ ...row,
724
+ pending_line_items:
725
+ typeof row.pending_line_items === 'string' ? JSON.parse(row.pending_line_items) : row.pending_line_items,
726
+ }));
727
+ };
728
+
729
+ export async function fetchPatientEncounterDiagnosis(
730
+ amrsVisitDiagnosisDto: AmrsVisitDiagnosisDto,
731
+ ): Promise<AmrsVisitDiagnosis[]> {
732
+ const etlBaseUrl = await getEtlBaseUrl();
733
+ const patientDiagnosisUrl = `${etlBaseUrl}/patient/encounter-diagnosis?visitDate=${amrsVisitDiagnosisDto.visitDate}&patientUuid=${amrsVisitDiagnosisDto.patientUuid}&locationUuid=${amrsVisitDiagnosisDto.locationUuid}`;
734
+ const response = await openmrsFetch(patientDiagnosisUrl);
735
+ const data = (await response.json()) as AmrsVisitDiagnosisResponse;
736
+ return data.results ?? [];
737
+ }
738
+
739
+ export type PatientDiagnosesForBillingDto = {
740
+ visitDate: string;
741
+ billingDate: string;
742
+ patientUuid: string;
743
+ locationUuid: string;
744
+ };
745
+
746
+ function diagnosisDedupeKey(d: AmrsVisitDiagnosis): string {
747
+ return `${d.encounter_id ?? ''}|${(d.icd11_code ?? '').trim()}`;
748
+ }
749
+
750
+ /** Numeric rank for sorting; missing/invalid ranks sort last. */
751
+ function diagnosisRankValue(d: AmrsVisitDiagnosis): number {
752
+ const r = d.dx_rank;
753
+ if (r == null || r === ('' as unknown)) return Number.POSITIVE_INFINITY;
754
+ const n = Number(r);
755
+ return Number.isFinite(n) ? n : Number.POSITIVE_INFINITY;
756
+ }
757
+
758
+ /** Order diagnoses for preauth: dx_rank 1 first, then 2…; unranked last. */
759
+ export function sortDiagnosesByRank(rows: AmrsVisitDiagnosis[]): AmrsVisitDiagnosis[] {
760
+ return [...rows].sort((a, b) => {
761
+ const byRank = diagnosisRankValue(a) - diagnosisRankValue(b);
762
+ if (byRank !== 0) return byRank;
763
+ return String(a.encounter_datetime ?? '').localeCompare(String(b.encounter_datetime ?? ''));
764
+ });
765
+ }
766
+
767
+ /**
768
+ * Preferred diagnosis for preauth prefill: explicit dx_rank === 1 when present,
769
+ * otherwise the best-ranked row that has an ICD-11 code.
770
+ */
771
+ export function preferredDiagnosisForPreauth(rows: AmrsVisitDiagnosis[]): AmrsVisitDiagnosis | null {
772
+ const withIcd = rows.filter((d) => (d.icd11_code ?? '').trim());
773
+ if (!withIcd.length) return null;
774
+ const sorted = sortDiagnosesByRank(withIcd);
775
+ return sorted.find((d) => Number(d.dx_rank) === 1) ?? sorted[0] ?? null;
776
+ }
777
+
778
+ /**
779
+ * Load patient diagnoses from the same three ETL sources as bill/claim details,
780
+ * merge, and dedupe. Used by Raise Preauth prefill (not wired into bill details).
781
+ */
782
+ export async function fetchPatientDiagnosesForBilling(
783
+ dto: PatientDiagnosesForBillingDto,
784
+ ): Promise<AmrsVisitDiagnosis[]> {
785
+ const visitDto: AmrsVisitDiagnosisDto = {
786
+ visitDate: dto.visitDate,
787
+ patientUuid: dto.patientUuid,
788
+ locationUuid: dto.locationUuid,
789
+ };
790
+ const maternityDto: AmrsMaternityDiagnosisDto = {
791
+ patientUuid: dto.patientUuid,
792
+ billingDate: dto.billingDate,
793
+ };
794
+
795
+ const [visitResult, maternityResult, encounterResult] = await Promise.allSettled([
796
+ fetchPatientDiagnosis(visitDto),
797
+ fetchMaternityDiagnosis(maternityDto),
798
+ fetchPatientEncounterDiagnosis(visitDto),
799
+ ]);
800
+
801
+ const visitRows: AmrsVisitDiagnosis[] = visitResult.status === 'fulfilled' ? (visitResult.value ?? []) : [];
802
+
803
+ const maternityRows: AmrsVisitDiagnosis[] =
804
+ maternityResult.status === 'fulfilled'
805
+ ? (maternityResult.value ?? [])
806
+ .filter((r) => r?.uuid != null)
807
+ .map(
808
+ (v): AmrsVisitDiagnosis => ({
809
+ patient_id: Number(v.patient_id) || 0,
810
+ encounter_id: v.encounter_id,
811
+ encounter_datetime: v.encounter_datetime,
812
+ facility: v.facility ?? '',
813
+ encounter_type: v.encounter_type,
814
+ concept_id: v.concept_id != null ? Number(v.concept_id) : null,
815
+ value_coded: v.value_coded != null ? Number(v.value_coded) : null,
816
+ dx_rank: (v as { dx_rank?: number | null }).dx_rank ?? null,
817
+ concept_source_name: v.concept_source_name,
818
+ hl7_code: v.hl7_code,
819
+ icd11_code: v.icd11_code,
820
+ provider_id: '',
821
+ national_id: v.practioner_nat_id ?? '',
822
+ speciality: v.practitioner_speciality ?? null,
823
+ uuid: v.uuid,
824
+ practioner_nat_id: v.practioner_nat_id,
825
+ practitioner_speciality: v.practitioner_speciality,
826
+ practitioner_identifier_type: 'National ID',
827
+ practitioner_body: v.practitioner_body,
828
+ }),
829
+ )
830
+ : [];
831
+
832
+ const encounterRows: AmrsVisitDiagnosis[] =
833
+ encounterResult.status === 'fulfilled' ? (encounterResult.value ?? []) : [];
834
+
835
+ // Best rank first so dedupe keeps the preferred row when the same ICD appears twice.
836
+ const merged = sortDiagnosesByRank([...visitRows, ...maternityRows, ...encounterRows]);
837
+ const seen = new Set<string>();
838
+ const deduped: AmrsVisitDiagnosis[] = [];
839
+ for (const row of merged) {
840
+ const key = diagnosisDedupeKey(row);
841
+ if (!key || key === '|') {
842
+ deduped.push(row);
843
+ continue;
844
+ }
845
+ if (seen.has(key)) continue;
846
+ seen.add(key);
847
+ deduped.push(row);
848
+ }
849
+ return deduped;
850
+ }
851
+
852
+ export async function fetchFacilityBedOccupancy(locationUuid: string): Promise<BedOccupancy> {
853
+ const { hieBaseUrl } = await getHieBaseUrl();
854
+ const response = await openmrsFetch(`${hieBaseUrl}/bed-occupancy?locationUuid=${locationUuid}`);
855
+ const data = (await response.json()) as BedOccupancy;
856
+ return data;
857
+ }
858
+
859
+ export async function fetchCaseSummary(locationUuid: string, patientUuid: string): Promise<VisitSummaryResponse> {
860
+ const { hieBaseUrl } = await getHieBaseUrl();
861
+ try {
862
+ const url =
863
+ `${hieBaseUrl}/case-summary` +
864
+ `?patientUuid=${encodeURIComponent(patientUuid)}` +
865
+ `&locationUuid=${encodeURIComponent(locationUuid)}`;
866
+
867
+ const response = await openmrsFetch(url);
868
+ const data = await response.json();
869
+ return data ?? null;
870
+ } catch (err) {
871
+ console.error(err);
872
+
873
+ throw new Error(err instanceof Error ? err.message : 'Unknown error occurred');
874
+ }
875
+ }
876
+
877
+ export function usePayerClaimPreview(invoiceNo: string, locationUuid: string) {
878
+ const { hieBaseUrl } = useConfig({
879
+ externalModuleName: '@ampath/esm-dha-workflow-app',
880
+ });
881
+ const url = invoiceNo
882
+ ? `${hieBaseUrl}/claim-preview/payer?providerClaimNo=${invoiceNo}&locationUuid=${locationUuid}`
883
+ : null;
884
+
885
+ const { data, error, isLoading, isValidating } = useSWR<{
886
+ data: PayerPreviewResponse
887
+ }>(url, openmrsFetch, {
888
+ keepPreviousData: true
889
+ });
890
+
891
+ const results = data?.data?.results;
892
+ const result = results && results?.length ? results[0] : null;
893
+
894
+ return {
895
+ payerPreviewResult: result,
896
+ error,
897
+ isLoading,
898
+ isValidating,
899
+ };
900
+ }