@ampath/esm-dha-workflow-app 4.0.0-next.44 → 4.0.0-next.445

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 (941) hide show
  1. package/README.md +47 -0
  2. package/dist/1100.js +1 -0
  3. package/dist/1100.js.map +1 -0
  4. package/dist/{197.js → 1197.js} +1 -1
  5. package/dist/1371.js +2 -0
  6. package/dist/1371.js.LICENSE.txt +282 -0
  7. package/dist/1371.js.map +1 -0
  8. package/dist/1435.js +1 -0
  9. package/dist/1435.js.map +1 -0
  10. package/dist/1673.js +1 -0
  11. package/dist/1673.js.map +1 -0
  12. package/dist/1843.js +1 -0
  13. package/dist/1843.js.map +1 -0
  14. package/dist/1931.js +1 -0
  15. package/dist/1931.js.map +1 -0
  16. package/dist/2272.js +2 -0
  17. package/dist/2272.js.map +1 -0
  18. package/dist/2383.js +1 -0
  19. package/dist/2383.js.map +1 -0
  20. package/dist/2439.js +1 -0
  21. package/dist/2439.js.map +1 -0
  22. package/dist/2535.js +1 -0
  23. package/dist/2535.js.map +1 -0
  24. package/dist/2592.js +1 -0
  25. package/dist/2592.js.map +1 -0
  26. package/dist/2632.js +1 -0
  27. package/dist/2632.js.map +1 -0
  28. package/dist/2635.js +1 -0
  29. package/dist/2635.js.map +1 -0
  30. package/dist/2663.js +1 -0
  31. package/dist/2663.js.map +1 -0
  32. package/dist/2687.js +1 -0
  33. package/dist/2687.js.map +1 -0
  34. package/dist/2802.js +1 -0
  35. package/dist/2802.js.map +1 -0
  36. package/dist/2808.js +1 -0
  37. package/dist/2808.js.map +1 -0
  38. package/dist/282.js +1 -1
  39. package/dist/282.js.LICENSE.txt +3 -3
  40. package/dist/282.js.map +1 -1
  41. package/dist/2848.js +1 -0
  42. package/dist/2848.js.map +1 -0
  43. package/dist/3.js +1 -0
  44. package/dist/3.js.map +1 -0
  45. package/dist/3016.js +1 -0
  46. package/dist/3016.js.map +1 -0
  47. package/dist/3041.js +1 -0
  48. package/dist/3041.js.map +1 -0
  49. package/dist/3099.js +1 -0
  50. package/dist/3182.js +1 -0
  51. package/dist/3182.js.map +1 -0
  52. package/dist/3184.js +2 -0
  53. package/dist/3184.js.map +1 -0
  54. package/dist/3196.js +1 -0
  55. package/dist/3196.js.map +1 -0
  56. package/dist/3242.js +1 -0
  57. package/dist/3242.js.map +1 -0
  58. package/dist/3270.js +1 -0
  59. package/dist/3270.js.map +1 -0
  60. package/dist/3288.js +1 -0
  61. package/dist/3288.js.map +1 -0
  62. package/dist/3311.js +2 -0
  63. package/dist/3311.js.LICENSE.txt +9 -0
  64. package/dist/3311.js.map +1 -0
  65. package/dist/3558.js +1 -0
  66. package/dist/3558.js.map +1 -0
  67. package/dist/3612.js +1 -0
  68. package/dist/3612.js.map +1 -0
  69. package/dist/3636.js +1 -0
  70. package/dist/3636.js.map +1 -0
  71. package/dist/3654.js +1 -0
  72. package/dist/3654.js.map +1 -0
  73. package/dist/3794.js +1 -0
  74. package/dist/3794.js.map +1 -0
  75. package/dist/3816.js +1 -0
  76. package/dist/3816.js.map +1 -0
  77. package/dist/3897.js +1 -0
  78. package/dist/3897.js.map +1 -0
  79. package/dist/3949.js +1 -0
  80. package/dist/3949.js.map +1 -0
  81. package/dist/4055.js +1 -0
  82. package/dist/408.js +1 -0
  83. package/dist/408.js.map +1 -0
  84. package/dist/409.js +1 -0
  85. package/dist/409.js.map +1 -0
  86. package/dist/411.js +1 -0
  87. package/dist/411.js.map +1 -0
  88. package/dist/4225.js +1 -0
  89. package/dist/4225.js.map +1 -0
  90. package/dist/4300.js +1 -0
  91. package/dist/{335.js → 4335.js} +1 -1
  92. package/dist/4353.js +1 -0
  93. package/dist/4353.js.map +1 -0
  94. package/dist/4399.js +1 -0
  95. package/dist/4399.js.map +1 -0
  96. package/dist/4569.js +1 -0
  97. package/dist/4569.js.map +1 -0
  98. package/dist/{652.js → 4652.js} +1 -1
  99. package/dist/474.js +1 -0
  100. package/dist/474.js.map +1 -0
  101. package/dist/4993.js +1 -0
  102. package/dist/4993.js.map +1 -0
  103. package/dist/5006.js +1 -0
  104. package/dist/5006.js.map +1 -0
  105. package/dist/5119.js +1 -0
  106. package/dist/5119.js.map +1 -0
  107. package/dist/5138.js +1 -0
  108. package/dist/5138.js.map +1 -0
  109. package/dist/5179.js +1 -0
  110. package/dist/5179.js.map +1 -0
  111. package/dist/5244.js +1 -0
  112. package/dist/5244.js.map +1 -0
  113. package/dist/5353.js +1 -0
  114. package/dist/5353.js.map +1 -0
  115. package/dist/5377.js +1 -0
  116. package/dist/5377.js.map +1 -0
  117. package/dist/5413.js +1 -0
  118. package/dist/5413.js.map +1 -0
  119. package/dist/5422.js +1 -0
  120. package/dist/5422.js.map +1 -0
  121. package/dist/5500.js +1 -0
  122. package/dist/5500.js.map +1 -0
  123. package/dist/5754.js +1 -0
  124. package/dist/5754.js.map +1 -0
  125. package/dist/5805.js +1 -0
  126. package/dist/5805.js.map +1 -0
  127. package/dist/6048.js +1 -0
  128. package/dist/6048.js.map +1 -0
  129. package/dist/6055.js +1 -0
  130. package/dist/6055.js.map +1 -0
  131. package/dist/6206.js +1 -0
  132. package/dist/6206.js.map +1 -0
  133. package/dist/6279.js +1 -0
  134. package/dist/6279.js.map +1 -0
  135. package/dist/6399.js +1 -0
  136. package/dist/6399.js.map +1 -0
  137. package/dist/6540.js +2 -0
  138. package/dist/6540.js.map +1 -0
  139. package/dist/6606.js +1 -0
  140. package/dist/6606.js.map +1 -0
  141. package/dist/6682.js +1 -0
  142. package/dist/6682.js.map +1 -0
  143. package/dist/6802.js +1 -0
  144. package/dist/6802.js.map +1 -0
  145. package/dist/7024.js +1 -0
  146. package/dist/7024.js.map +1 -0
  147. package/dist/72.js +1 -0
  148. package/dist/72.js.map +1 -0
  149. package/dist/7269.js +1 -0
  150. package/dist/7269.js.map +1 -0
  151. package/dist/7332.js +1 -0
  152. package/dist/7332.js.map +1 -0
  153. package/dist/7369.js +1 -0
  154. package/dist/7369.js.map +1 -0
  155. package/dist/7593.js +1 -0
  156. package/dist/7593.js.map +1 -0
  157. package/dist/7694.js +1 -0
  158. package/dist/7694.js.map +1 -0
  159. package/dist/7698.js +1 -0
  160. package/dist/7698.js.map +1 -0
  161. package/dist/7734.js +1 -0
  162. package/dist/7734.js.map +1 -0
  163. package/dist/774.js +1 -0
  164. package/dist/774.js.map +1 -0
  165. package/dist/7852.js +1 -0
  166. package/dist/7852.js.map +1 -0
  167. package/dist/7949.js +2 -0
  168. package/dist/{246.js.LICENSE.txt → 7949.js.LICENSE.txt} +1 -10
  169. package/dist/7949.js.map +1 -0
  170. package/dist/7958.js +1 -0
  171. package/dist/7958.js.map +1 -0
  172. package/dist/8137.js +1 -0
  173. package/dist/8137.js.map +1 -0
  174. package/dist/8167.js +1 -0
  175. package/dist/8167.js.map +1 -0
  176. package/dist/818.js +1 -0
  177. package/dist/818.js.map +1 -0
  178. package/dist/8250.js +1 -0
  179. package/dist/8250.js.map +1 -0
  180. package/dist/8308.js +1 -0
  181. package/dist/8308.js.map +1 -0
  182. package/dist/8735.js +1 -0
  183. package/dist/8735.js.map +1 -0
  184. package/dist/8947.js +1 -0
  185. package/dist/8947.js.map +1 -0
  186. package/dist/8961.js +1 -0
  187. package/dist/8961.js.map +1 -0
  188. package/dist/902.js +1 -0
  189. package/dist/902.js.map +1 -0
  190. package/dist/9062.js +1 -0
  191. package/dist/9062.js.map +1 -0
  192. package/dist/9134.js +1 -0
  193. package/dist/9134.js.map +1 -0
  194. package/dist/9249.js +1 -0
  195. package/dist/9249.js.map +1 -0
  196. package/dist/9418.js +2 -0
  197. package/dist/9418.js.LICENSE.txt +1 -0
  198. package/dist/9418.js.map +1 -0
  199. package/dist/9429.js +1 -0
  200. package/dist/9429.js.map +1 -0
  201. package/dist/9442.js +1 -0
  202. package/dist/9442.js.map +1 -0
  203. package/dist/961.js +1 -1
  204. package/dist/961.js.map +1 -1
  205. package/dist/968.js +1 -0
  206. package/dist/968.js.map +1 -0
  207. package/dist/9709.js +1 -0
  208. package/dist/9709.js.map +1 -0
  209. package/dist/9768.js +1 -0
  210. package/dist/9768.js.map +1 -0
  211. package/dist/9770.js +1 -0
  212. package/dist/9770.js.map +1 -0
  213. package/dist/9879.js +1 -0
  214. package/dist/9879.js.map +1 -0
  215. package/dist/9974.js +1 -0
  216. package/dist/9974.js.map +1 -0
  217. package/dist/esm-dha-workflow-app.js +1 -1
  218. package/dist/esm-dha-workflow-app.js.buildmanifest.json +2249 -224
  219. package/dist/esm-dha-workflow-app.js.map +1 -1
  220. package/dist/main.js +1 -1
  221. package/dist/main.js.map +1 -1
  222. package/dist/routes.json +1 -1
  223. package/jest.config.js +4 -0
  224. package/local-config.json +9 -0
  225. package/package.json +29 -11
  226. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  227. package/src/admissions/admission-request-list/admission-request-list.tsx +263 -0
  228. package/src/admissions/admissions-dashboard.component.scss +15 -0
  229. package/src/admissions/admissions-dashboard.component.tsx +277 -0
  230. package/src/admissions/admissions.resource.ts +233 -0
  231. package/src/admissions/admitted-list/admitted-patients-list.tsx +268 -0
  232. package/src/admissions/awaiting-discharge-list/awaiting-discharge-list.tsx +197 -0
  233. package/src/admissions/bed-assigment-request/bed-assignment-request-list.tsx +134 -0
  234. package/src/admissions/constants/index.ts +33 -0
  235. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  236. package/src/admissions/discharged-list/discharged-list.tsx +67 -0
  237. package/src/admissions/form-entry-workspace/form-entry-workspace.tsx +62 -0
  238. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  239. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  240. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  241. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  242. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  243. package/src/admissions/modal/add-bill-items/add-bill-items.modal.scss +17 -0
  244. package/src/admissions/modal/add-bill-items/add-bill-items.modal.tsx +220 -0
  245. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  246. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  247. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  248. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +111 -0
  249. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  250. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  251. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  252. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  253. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  254. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +86 -0
  255. package/src/admissions/types/index.ts +263 -0
  256. package/src/appointments/appointments.component.scss +6 -0
  257. package/src/appointments/appointments.component.tsx +8 -1
  258. package/src/billing/admin/claims/claims-list.component.scss +13 -0
  259. package/src/billing/admin/claims/claims-list.component.tsx +163 -0
  260. package/src/billing/admin/claims-admin-dashboard.component.scss +0 -0
  261. package/src/billing/admin/claims-admin-dashboard.component.tsx +32 -0
  262. package/src/billing/api/billing.api.ts +139 -0
  263. package/src/billing/billing-claims.resource.ts +1112 -0
  264. package/src/billing/billing-dashboard-link.component.tsx +31 -0
  265. package/src/billing/billing-dashboard-reset.ts +27 -0
  266. package/src/billing/billing-root.tsx +37 -0
  267. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  268. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  269. package/src/billing/dashboard/v2/active-visits/active-visits.component.tsx +257 -0
  270. package/src/billing/dashboard/v2/active-visits/active-visits.resource.ts +85 -0
  271. package/src/billing/dashboard/v2/active-visits/active-visits.scss +15 -0
  272. package/src/billing/dashboard/v2/active-visits.component.tsx +102 -0
  273. package/src/billing/dashboard/v2/admissions/admission-requests-tab.component.tsx +79 -0
  274. package/src/billing/dashboard/v2/billing-and-claims-patient-chart.component.tsx +52 -0
  275. package/src/billing/dashboard/v2/billing-claims-dashboard.component.scss +221 -0
  276. package/src/billing/dashboard/v2/billing-claims-dashboard.component.tsx +342 -0
  277. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.scss +90 -0
  278. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.tsx +101 -0
  279. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.scss +199 -0
  280. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.tsx +361 -0
  281. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.resource.ts +239 -0
  282. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.scss +246 -0
  283. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.tsx +182 -0
  284. package/src/billing/dashboard/v2/claim-statuses.ts +143 -0
  285. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  286. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +35 -0
  287. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.scss +67 -0
  288. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.tsx +90 -0
  289. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.scss +28 -0
  290. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.tsx +36 -0
  291. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.scss +119 -0
  292. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.tsx +198 -0
  293. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.scss +5 -0
  294. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +160 -0
  295. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.scss +105 -0
  296. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.tsx +184 -0
  297. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.scss +161 -0
  298. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.tsx +328 -0
  299. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +96 -0
  300. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-document.component.tsx +236 -0
  301. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.scss +98 -0
  302. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.tsx +293 -0
  303. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +133 -0
  304. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +217 -0
  305. package/src/billing/dashboard/v2/claim-visits/claim-list/claim-visits.component.scss +28 -0
  306. package/src/billing/dashboard/v2/claim-visits/claim-list/claim-visits.component.tsx +315 -0
  307. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-by-token.component.tsx +150 -0
  308. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.scss +13 -0
  309. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.tsx +116 -0
  310. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.scss +338 -0
  311. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.tsx +616 -0
  312. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  313. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  314. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +17 -0
  315. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +56 -0
  316. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  317. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  318. package/src/billing/dashboard/v2/claim-visits/modal/submit-claim/submit-claim.modal.tsx +280 -0
  319. package/src/billing/dashboard/v2/claim-visits/shared/_empty-state.scss +28 -0
  320. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.scss +298 -0
  321. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.tsx +252 -0
  322. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.scss +42 -0
  323. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.tsx +67 -0
  324. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.scss +61 -0
  325. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.tsx +150 -0
  326. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  327. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  328. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.tsx +660 -0
  329. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.scss +595 -0
  330. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.tsx +810 -0
  331. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.resource.ts +282 -0
  332. package/src/billing/dashboard/v2/claims-accounting/bill-utils.ts +134 -0
  333. package/src/billing/dashboard/v2/claims-accounting/claim-detail.component.tsx +346 -0
  334. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.scss +546 -0
  335. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.tsx +206 -0
  336. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.resource.ts +337 -0
  337. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.scss +90 -0
  338. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.tsx +90 -0
  339. package/src/billing/dashboard/v2/claims-accounting/remittances.component.tsx +169 -0
  340. package/src/billing/dashboard/v2/claims-accounting/remittances.resource.ts +46 -0
  341. package/src/billing/dashboard/v2/claims-accounting/status-meta.ts +25 -0
  342. package/src/billing/dashboard/v2/clearance/cash-patients.scss +18 -0
  343. package/src/billing/dashboard/v2/clearance/cash.component.tsx +145 -0
  344. package/src/billing/dashboard/v2/clearance/clearance.component.scss +84 -0
  345. package/src/billing/dashboard/v2/clearance/clearance.component.tsx +225 -0
  346. package/src/billing/dashboard/v2/clearance/pay-cash.component.tsx +199 -0
  347. package/src/billing/dashboard/v2/clearance/pay-cash.scss +28 -0
  348. package/src/billing/dashboard/v2/clearance/prepaid-services.component.tsx +112 -0
  349. package/src/billing/dashboard/v2/facility-bills/claim-status.ts +249 -0
  350. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.scss +140 -0
  351. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.tsx +688 -0
  352. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  353. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +267 -0
  354. package/src/billing/dashboard/v2/facility-bills/preauths.component.tsx +130 -0
  355. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.scss +22 -0
  356. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.tsx +382 -0
  357. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.scss +0 -0
  358. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.tsx +0 -0
  359. package/src/billing/dashboard/v2/new-facility-bills/bills-table.component.tsx +78 -0
  360. package/src/billing/dashboard/v2/new-facility-bills/bills-table.scss +18 -0
  361. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.component.tsx +64 -0
  362. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.scss +146 -0
  363. package/src/billing/dashboard/v2/patient-bill-details/attachments/add-attachments.component.tsx +234 -0
  364. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachment.component.tsx +157 -0
  365. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachments.scss +92 -0
  366. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  367. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.tsx +326 -0
  368. package/src/billing/dashboard/v2/patient-bill-details/attachments/death-notification.component.tsx +162 -0
  369. package/src/billing/dashboard/v2/patient-bill-details/attachments/death-notification.resource.ts +112 -0
  370. package/src/billing/dashboard/v2/patient-bill-details/attachments/death-notification.scss +88 -0
  371. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  372. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +269 -0
  373. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  374. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +124 -0
  375. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.component.tsx +152 -0
  376. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.scss +225 -0
  377. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  378. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +173 -0
  379. package/src/billing/dashboard/v2/patient-bill-details/attachments/generate-attachments.component.tsx +450 -0
  380. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.component.tsx +151 -0
  381. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.scss +225 -0
  382. package/src/billing/dashboard/v2/patient-bill-details/attachments/type.ts +44 -0
  383. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.scss +107 -0
  384. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.tsx +508 -0
  385. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.scss +30 -0
  386. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.tsx +94 -0
  387. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.scss +89 -0
  388. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.tsx +53 -0
  389. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.scss +32 -0
  390. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.tsx +215 -0
  391. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  392. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  393. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +187 -0
  394. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.scss +153 -0
  395. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.tsx +458 -0
  396. package/src/billing/dashboard/v2/patient-bill-details/payment-mode.ts +124 -0
  397. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.scss +27 -0
  398. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.tsx +234 -0
  399. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.scss +27 -0
  400. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.tsx +123 -0
  401. package/src/billing/dashboard/v2/preauth/preauth-attachments.component.tsx +389 -0
  402. package/src/billing/dashboard/v2/preauth/preauth-list.component.scss +38 -0
  403. package/src/billing/dashboard/v2/preauth/preauth-list.component.tsx +241 -0
  404. package/src/billing/dashboard/v2/preauth/preauth-status-tag.component.tsx +75 -0
  405. package/src/billing/dashboard/v2/preauth/preauth-typed-fields.md +125 -0
  406. package/src/billing/dashboard/v2/preauth/preauth.resource.ts +1032 -0
  407. package/src/billing/dashboard/v2/preauth/preauth.workspace.scss +91 -0
  408. package/src/billing/dashboard/v2/preauth/preauth.workspace.tsx +1802 -0
  409. package/src/billing/dashboard/v2/preauth/preauthorizations-tab.component.tsx +53 -0
  410. package/src/billing/dashboard/v2/sha-claims/sha-claims-table.component.tsx +36 -0
  411. package/src/billing/dashboard/v2/sha-claims/sha-claims.component.tsx +60 -0
  412. package/src/billing/dashboard/v2/sha-claims/sha-claims.scss +8 -0
  413. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.scss +17 -0
  414. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.tsx +15 -0
  415. package/src/billing/dashboard/v2/shared/empty-state.component.scss +24 -0
  416. package/src/billing/dashboard/v2/shared/empty-state.component.tsx +13 -0
  417. package/src/billing/dashboard/v2/shared/scroll-to-top.component.scss +54 -0
  418. package/src/billing/dashboard/v2/shared/scroll-to-top.component.tsx +54 -0
  419. package/src/billing/dashboard/v2/shared/table-toolbar.component.scss +77 -0
  420. package/src/billing/dashboard/v2/shared/table-toolbar.component.tsx +48 -0
  421. package/src/billing/dashboard/v2/types/index.ts +534 -0
  422. package/src/billing/dashboard/v3/active-visits/active-visits.component.tsx +256 -0
  423. package/src/billing/dashboard/v3/active-visits/active-visits.resource.ts +57 -0
  424. package/src/billing/dashboard/v3/active-visits/active-visits.scss +15 -0
  425. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.scss +90 -0
  426. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.tsx +101 -0
  427. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.scss +199 -0
  428. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.tsx +361 -0
  429. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.resource.ts +240 -0
  430. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.scss +246 -0
  431. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.tsx +182 -0
  432. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  433. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +44 -0
  434. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.scss +5 -0
  435. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.tsx +40 -0
  436. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.scss +10 -0
  437. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.tsx +25 -0
  438. package/src/billing/dashboard/v3/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +268 -0
  439. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.scss +6 -0
  440. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +85 -0
  441. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +0 -0
  442. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +109 -0
  443. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.scss +103 -0
  444. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.tsx +519 -0
  445. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.scss +5 -0
  446. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.tsx +139 -0
  447. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  448. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  449. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.scss +7 -0
  450. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.tsx +35 -0
  451. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +6 -0
  452. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +33 -0
  453. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  454. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  455. package/src/billing/dashboard/v3/claim-visits/modal/identify-emergency-unknown-patient/identify-emergencu-unknown-patient.scss +407 -0
  456. package/src/billing/dashboard/v3/claim-visits/modal/identify-emergency-unknown-patient/identify-emergency-unknown-patient.component.tsx +523 -0
  457. package/src/billing/dashboard/v3/claim-visits/modal/identify-emergency-unknown-patient/identify-patient-helper.ts +77 -0
  458. package/src/billing/dashboard/v3/claim-visits/modal/submit-claim/submit-claim.modal.tsx +280 -0
  459. package/src/billing/dashboard/v3/claim-visits/modal/submit-emergency-claim/submit-emergency-claim.component.tsx +91 -0
  460. package/src/billing/dashboard/v3/claim-visits/modal/submit-emergency-claim/submit-emergency.scss +14 -0
  461. package/src/billing/dashboard/v3/claim-visits/payer-preview/index.scss +140 -0
  462. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-tile.component.tsx +55 -0
  463. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-workspace.component.tsx +171 -0
  464. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-doctors.component.tsx +54 -0
  465. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-lines.component.tsx +48 -0
  466. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-notes.component.tsx +47 -0
  467. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-diagnoses.component.tsx +44 -0
  468. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-interventions.component.tsx +44 -0
  469. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  470. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  471. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.tsx +644 -0
  472. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.scss +595 -0
  473. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.tsx +810 -0
  474. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.resource.ts +282 -0
  475. package/src/billing/dashboard/v3/claims-accounting/bill-utils.ts +134 -0
  476. package/src/billing/dashboard/v3/claims-accounting/claim-detail.component.tsx +346 -0
  477. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.scss +546 -0
  478. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.tsx +206 -0
  479. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.resource.ts +337 -0
  480. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.scss +90 -0
  481. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.tsx +90 -0
  482. package/src/billing/dashboard/v3/claims-accounting/remittances.component.tsx +169 -0
  483. package/src/billing/dashboard/v3/claims-accounting/remittances.resource.ts +46 -0
  484. package/src/billing/dashboard/v3/claims-accounting/status-meta.ts +25 -0
  485. package/src/billing/dashboard/v3/claims-stats-dashboard/claim-stat/claim-stat.component.scss +27 -0
  486. package/src/billing/dashboard/v3/claims-stats-dashboard/claim-stat/claim-stat.component.tsx +41 -0
  487. package/src/billing/dashboard/v3/claims-stats-dashboard/claims-stats-dashboard.component.scss +16 -0
  488. package/src/billing/dashboard/v3/claims-stats-dashboard/claims-stats-dashboard.component.tsx +184 -0
  489. package/src/billing/dashboard/v3/claims-stats-dashboard/modal/claim-stats-list/claim-stats-list.modal.scss +0 -0
  490. package/src/billing/dashboard/v3/claims-stats-dashboard/modal/claim-stats-list/claim-stats-list.modal.tsx +27 -0
  491. package/src/billing/dashboard/v3/clearance/clearance.component.scss +100 -0
  492. package/src/billing/dashboard/v3/clearance/clearance.component.tsx +0 -0
  493. package/src/billing/dashboard/v3/clearance/prepaid-services.component.tsx +112 -0
  494. package/src/billing/dashboard/v3/facility-bills/claim-status.ts +243 -0
  495. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.scss +92 -0
  496. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.tsx +306 -0
  497. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  498. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +232 -0
  499. package/src/billing/dashboard/v3/facility-bills/preauths.component.tsx +127 -0
  500. package/src/billing/dashboard/v3/patient-bill-details/attachments/add-attachments.component.tsx +228 -0
  501. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachment.component.tsx +157 -0
  502. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachments.scss +92 -0
  503. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary-helper.ts +58 -0
  504. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  505. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.tsx +287 -0
  506. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  507. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +352 -0
  508. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-helper.ts +117 -0
  509. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  510. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +126 -0
  511. package/src/billing/dashboard/v3/patient-bill-details/attachments/final-bill.component.tsx +75 -0
  512. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  513. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +253 -0
  514. package/src/billing/dashboard/v3/patient-bill-details/attachments/generate-attachments.component.tsx +450 -0
  515. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.component.tsx +151 -0
  516. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.scss +225 -0
  517. package/src/billing/dashboard/v3/patient-bill-details/attachments/lab-results/lab-orders.component.tsx +198 -0
  518. package/src/billing/dashboard/v3/patient-bill-details/attachments/lab-results/lab-orders.scss +227 -0
  519. package/src/billing/dashboard/v3/patient-bill-details/attachments/medical-report/medical-report.component.tsx +346 -0
  520. package/src/billing/dashboard/v3/patient-bill-details/attachments/medical-report/medical-report.scss +265 -0
  521. package/src/billing/dashboard/v3/patient-bill-details/attachments/proforma-invoice/proforma-invoice.component.tsx +347 -0
  522. package/src/billing/dashboard/v3/patient-bill-details/attachments/proforma-invoice/proforma-invoice.scss +285 -0
  523. package/src/billing/dashboard/v3/patient-bill-details/attachments/type.ts +280 -0
  524. package/src/billing/dashboard/v3/patient-bill-details/attachments/ultrasound-report/ultrasound-report.scss +273 -0
  525. package/src/billing/dashboard/v3/patient-bill-details/attachments/ultrasound-report/utlrasound-report.component.tsx +435 -0
  526. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.scss +17 -0
  527. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.tsx +377 -0
  528. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.scss +0 -0
  529. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.tsx +71 -0
  530. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  531. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  532. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.scss +14 -0
  533. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +156 -0
  534. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.scss +6 -0
  535. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.tsx +137 -0
  536. package/src/billing/dashboard/v3/patient-bill-details/modals/claim-details/claim-details.modal.scss +28 -0
  537. package/src/billing/dashboard/v3/patient-bill-details/modals/claim-details/claim-details.modal.tsx +170 -0
  538. package/src/billing/dashboard/v3/patient-bill-details/modals/pomsf/pomsf-scheme-balance.util.test.ts +56 -0
  539. package/src/billing/dashboard/v3/patient-bill-details/modals/pomsf/pomsf-scheme-balance.util.ts +27 -0
  540. package/src/billing/dashboard/v3/patient-bill-details/modals/pomsf/set-effective-pomsf-coverage.component.tsx +128 -0
  541. package/src/billing/dashboard/v3/patient-bill-details/modals/pomsf/set-effective-pomsf-coverage.scss +27 -0
  542. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.scss +85 -0
  543. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.tsx +363 -0
  544. package/src/billing/dashboard/v3/patient-bill-details/patient-visit-details.tsx +256 -0
  545. package/src/billing/dashboard/v3/patient-bill-details/patient-visit.scss +9 -0
  546. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.scss +0 -0
  547. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.tsx +102 -0
  548. package/src/billing/dashboard/v3/preauth/elective/elective-authorize.resource.ts +284 -0
  549. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.scss +125 -0
  550. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.tsx +1184 -0
  551. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.scss +15 -0
  552. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.tsx +377 -0
  553. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.resource.ts +1378 -0
  554. package/src/billing/dashboard/v3/preauth/elective/elective-requests-list.component.tsx +357 -0
  555. package/src/billing/dashboard/v3/preauth/preauth-attachments.component.tsx +388 -0
  556. package/src/billing/dashboard/v3/preauth/preauth-list.component.scss +34 -0
  557. package/src/billing/dashboard/v3/preauth/preauth-list.component.tsx +300 -0
  558. package/src/billing/dashboard/v3/preauth/preauth-status-tag.component.tsx +75 -0
  559. package/src/billing/dashboard/v3/preauth/preauth-typed-fields.md +125 -0
  560. package/src/billing/dashboard/v3/preauth/preauth.resource.ts +1549 -0
  561. package/src/billing/dashboard/v3/preauth/preauth.workspace.scss +176 -0
  562. package/src/billing/dashboard/v3/preauth/preauth.workspace.tsx +2458 -0
  563. package/src/billing/dashboard/v3/preauth/preauthorizations-tab.component.tsx +55 -0
  564. package/src/billing/dashboard/v3/shared/empty-state.component.scss +25 -0
  565. package/src/billing/dashboard/v3/shared/empty-state.component.tsx +13 -0
  566. package/src/billing/dashboard/v3/shared/table-toolbar.component.scss +64 -0
  567. package/src/billing/dashboard/v3/shared/table-toolbar.component.tsx +48 -0
  568. package/src/billing/dashboard/v3/types/index.ts +450 -0
  569. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.extension.tsx +55 -0
  570. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.scss +16 -0
  571. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  572. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +514 -0
  573. package/src/billing/invoice/bill.resource.ts +47 -0
  574. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  575. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  576. package/src/billing/invoice/invoice.scss +113 -0
  577. package/src/billing/invoice/invoice.tsx +1441 -0
  578. package/src/billing/invoice/line-items/line-items.scss +0 -0
  579. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  580. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  581. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  582. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  583. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  584. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  585. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  586. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  587. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  588. package/src/billing/maternity-discharge.resource.ts +21 -0
  589. package/src/billing/reports/billing-and-claims-reports-dashboard.scss +40 -0
  590. package/src/billing/reports/billing-and-claims-reports-dashboard.tsx +32 -0
  591. package/src/billing/reports/claims/claims-report-dashboard.scss +55 -0
  592. package/src/billing/reports/claims/claims-report-dashboard.tsx +136 -0
  593. package/src/billing/reports/claims/summary-data/summary-data.scss +24 -0
  594. package/src/billing/reports/claims/summary-data/summary-data.tsx +184 -0
  595. package/src/billing/types/index.ts +411 -0
  596. package/src/billing/utils/index.ts +17 -0
  597. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  598. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  599. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +223 -0
  600. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  601. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +874 -0
  602. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +20 -0
  603. package/src/billing/workspaces/create-order-bill-form-workspace/types.ts +49 -0
  604. package/src/bookings/bookings.component.scss +7 -0
  605. package/src/bookings/bookings.component.tsx +35 -0
  606. package/src/bookings/daily/daily-bookings.resource.ts +2 -1
  607. package/src/case-summary/case-summary.extension.scss +13 -0
  608. package/src/case-summary/case-summary.extension.tsx +40 -0
  609. package/src/case-summary/case-summary.resource.test.ts +69 -0
  610. package/src/case-summary/case-summary.resource.ts +52 -0
  611. package/src/case-summary/components/case-summary-printable.component.scss +174 -0
  612. package/src/case-summary/components/case-summary-printable.component.tsx +288 -0
  613. package/src/case-summary/components/case-summary-printable.utils.ts +51 -0
  614. package/src/case-summary/types/case-summary.types.ts +152 -0
  615. package/src/claims/claims.component.scss +70 -0
  616. package/src/claims/claims.component.tsx +743 -0
  617. package/src/claims/claims.resource.ts +1855 -0
  618. package/src/claims/index.ts +365 -0
  619. package/src/claims/interventions.resource.ts +131 -0
  620. package/src/claims/utils.ts +64 -0
  621. package/src/config-schema.ts +264 -0
  622. package/src/context/patient-context.tsx +27 -0
  623. package/src/critical-care-unit/critical-care-root.tsx +23 -0
  624. package/src/critical-care-unit/hdu/hdu-queues.component.scss +7 -0
  625. package/src/critical-care-unit/hdu/hdu-queues.component.tsx +31 -0
  626. package/src/critical-care-unit/hdu/queues/consultation/hdu-consultation.tsx +18 -0
  627. package/src/critical-care-unit/icu/icu-queues.component.scss +7 -0
  628. package/src/critical-care-unit/icu/icu-queues.component.tsx +31 -0
  629. package/src/critical-care-unit/icu/queues/consultation/icu-consultation.tsx +17 -0
  630. package/src/critical-care-unit/icu-burns/icu-burns-queues.component.scss +7 -0
  631. package/src/critical-care-unit/icu-burns/icu-burns-queues.component.tsx +30 -0
  632. package/src/critical-care-unit/icu-burns/queues/consultation/icu-burns-consultation.tsx +17 -0
  633. package/src/critical-care-unit/nicu/nicu-queues.component.scss +7 -0
  634. package/src/critical-care-unit/nicu/nicu-queues.component.tsx +31 -0
  635. package/src/critical-care-unit/nicu/queues/consultation/nicu-consultation.tsx +17 -0
  636. package/src/critical-care-unit/picu/picu-queues.component.scss +7 -0
  637. package/src/critical-care-unit/picu/picu-queues.component.tsx +31 -0
  638. package/src/critical-care-unit/picu/queues/consultation/picu-consultation.tsx +17 -0
  639. package/src/dashboard/charts/chart.component.scss +24 -0
  640. package/src/dashboard/charts/chart.component.tsx +56 -0
  641. package/src/dashboard/dashboard.component.scss +48 -3
  642. package/src/dashboard/dashboard.component.tsx +29 -38
  643. package/src/dashboard/overview/overview.component.scss +40 -59
  644. package/src/dashboard/overview/overview.component.tsx +55 -41
  645. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  646. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  647. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  648. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  649. package/src/dashboard-meta/case-summary.meta.ts +6 -0
  650. package/src/dashboard-meta/claims-admin.meta.ts +6 -0
  651. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  652. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  653. package/src/dashboard-meta/elective-preauth.meta.ts +6 -0
  654. package/src/dashboard-meta/emt-dashboard.meta.ts +6 -0
  655. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  656. package/src/dashboard-meta/maternity-dashboard.meta.ts +6 -0
  657. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  658. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  659. package/src/{registry-dashboard.meta.ts → dashboard-meta/registry-dashboard.meta.ts} +2 -2
  660. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  661. package/src/dashboard-meta/shr-dashboard.meta.ts +19 -0
  662. package/src/dashboard-meta/specialized-clinics-dashboard.meta.ts +6 -0
  663. package/src/dashboard-meta/telemedicine-dashboard.meta.ts +6 -0
  664. package/src/dashboard-meta/telemedicine-patient-chart.meta.ts +6 -0
  665. package/src/death-reporting/death-reporting-form-button.component.tsx +50 -0
  666. package/src/death-reporting/death-reporting-form-button.resource.ts +64 -0
  667. package/src/emt/cr-lookup.resource.test.ts +88 -0
  668. package/src/emt/cr-lookup.resource.ts +42 -0
  669. package/src/emt/emt-queue.component.test.tsx +353 -0
  670. package/src/emt/emt-queue.component.tsx +463 -0
  671. package/src/emt/emt-queue.scss +85 -0
  672. package/src/emt/emt.resource.test.ts +247 -0
  673. package/src/emt/emt.resource.ts +150 -0
  674. package/src/emt/handover-modal/handover-modal.component.test.tsx +273 -0
  675. package/src/emt/handover-modal/handover-modal.component.tsx +538 -0
  676. package/src/emt/handover-modal/handover-modal.scss +113 -0
  677. package/src/emt/types/emt.types.ts +137 -0
  678. package/src/index.ts +232 -11
  679. package/src/mnch/maternity/maternity-queues.component.scss +7 -0
  680. package/src/mnch/maternity/maternity-queues.component.tsx +32 -0
  681. package/src/mnch/maternity/queues/triage/maternity-triage.tsx +15 -0
  682. package/src/mnch/mch/mch-queues.component.scss +10 -0
  683. package/src/mnch/mch/mch-queues.component.tsx +36 -0
  684. package/src/{mch → mnch/mch}/queues/consultation/mch-consultation.tsx +2 -2
  685. package/src/{mch → mnch/mch}/queues/triage/mch-triage.tsx +2 -2
  686. package/src/mnch/mnch-root.tsx +17 -0
  687. package/src/mortuary/mortuary.component.tsx +2 -2
  688. package/src/pharmacy/pharmacy.component.scss +16 -0
  689. package/src/pharmacy/pharmacy.component.tsx +11 -6
  690. package/src/registers/registers.component.tsx +8 -0
  691. package/src/registry/drawer/emr-compare.component.scss +263 -0
  692. package/src/registry/drawer/emr-compare.component.tsx +302 -0
  693. package/src/registry/drawer/emr-compare.resource.ts +181 -0
  694. package/src/registry/drawer/emr-create-preview.component.tsx +123 -0
  695. package/src/registry/drawer/otp-verification-step.component.tsx +398 -0
  696. package/src/registry/drawer/pomsf-balance.util.test.ts +177 -0
  697. package/src/registry/drawer/pomsf-balance.util.ts +116 -0
  698. package/src/registry/drawer/verification.resource.ts +60 -0
  699. package/src/registry/drawer/workflow-drawer.component.scss +1242 -0
  700. package/src/registry/drawer/workflow-drawer.component.tsx +1542 -0
  701. package/src/registry/eligibility/eligibility-details/eligibility-details.scss +38 -0
  702. package/src/registry/eligibility/eligibility-details/eligibility-details.tsx +101 -0
  703. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +16 -0
  704. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +120 -0
  705. package/src/registry/eligibility/modal/eligibility-details.modal.scss +0 -0
  706. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +45 -0
  707. package/src/registry/emergency/emergency-extension.component.tsx +599 -0
  708. package/src/registry/emergency/emergency-helper.ts +47 -0
  709. package/src/registry/emergency/emergency.resource.ts +291 -0
  710. package/src/registry/emergency/emergency.scss +123 -0
  711. package/src/registry/emergency/otp-component.tsx +289 -0
  712. package/src/registry/emergency/type/index.ts +77 -0
  713. package/src/registry/emergency/unidentified/unidentified-registration.component.tsx +154 -0
  714. package/src/registry/emergency/unidentified/unidentified-registration.scss +0 -0
  715. package/src/registry/emergency/unidentified/unidentified.component.tsx +376 -0
  716. package/src/registry/emergency/unidentified/unidentified.scss +0 -0
  717. package/src/registry/hie.resource.ts +481 -0
  718. package/src/registry/hie.types.ts +63 -0
  719. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.scss +277 -0
  720. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.tsx +218 -0
  721. package/src/registry/modal/biometrics-verification-modal/type.ts +39 -0
  722. package/src/registry/modal/client-details-modal/client-details-modal.tsx +65 -29
  723. package/src/registry/modal/otp-modal/otp-whitlisting-modal.component.tsx +809 -0
  724. package/src/registry/modal/otp-modal/otp-whitlisting-modal.scss +354 -0
  725. package/src/registry/modal/otp-modal/otp-whitlisting.scss +0 -0
  726. package/src/registry/modal/otp-verification-modal/claims-consent.scss +72 -0
  727. package/src/registry/modal/otp-verification-modal/claims-consent.tsx +135 -0
  728. package/src/registry/modal/otp-verification-modal/extension/claims-consent.extension.tsx +130 -0
  729. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +15 -3
  730. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +136 -44
  731. package/src/registry/modal/send-to-triage/payment-details.tsx +120 -0
  732. package/src/registry/modal/send-to-triage/payment-method.component.tsx +54 -0
  733. package/src/registry/modal/send-to-triage/send-to-queue.modal.tsx +991 -0
  734. package/src/registry/modal/send-to-triage/send-to-queue.workspace.tsx +24 -0
  735. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +156 -3
  736. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +1086 -130
  737. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.scss +34 -0
  738. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.tsx +231 -0
  739. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  740. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  741. package/src/registry/registration-list/registration-list.component.scss +32 -0
  742. package/src/registry/registration-list/registration-list.component.tsx +103 -0
  743. package/src/registry/registry-entry.tsx +11 -0
  744. package/src/registry/registry.component.scss +402 -78
  745. package/src/registry/registry.component.tsx +732 -220
  746. package/src/registry/registry.resource.ts +22 -3
  747. package/src/registry/types/index.ts +126 -9
  748. package/src/registry/utils/error-handler.ts +54 -0
  749. package/src/registry/utils/format-dependant-display-data.ts +1 -1
  750. package/src/registry/utils/hie-client-adapter.ts +7 -4
  751. package/src/registry/utils/mask-data.ts +40 -0
  752. package/src/registry/utils/phone-number-formatter.ts +11 -0
  753. package/src/resources/dashboard.resource.ts +20 -0
  754. package/src/resources/identifier-types.ts +2 -0
  755. package/src/resources/patient-resource.ts +7 -2
  756. package/src/resources/queue.resource.ts +3 -3
  757. package/src/resources/superset.resource.ts +41 -0
  758. package/src/resources/visit.resource.ts +19 -1
  759. package/src/root.component.tsx +9 -7
  760. package/src/routes.json +651 -40
  761. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  762. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +193 -0
  763. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  764. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +201 -0
  765. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  766. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  767. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  768. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  769. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  770. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  771. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  772. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  773. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  774. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  775. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  776. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +35 -0
  777. package/src/service-queues/consultation/consultation.component.tsx +9 -0
  778. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  779. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  780. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  781. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +110 -0
  782. package/src/service-queues/modals/move/move-patient.component.scss +1 -1
  783. package/src/service-queues/modals/move/move-patient.component.tsx +31 -17
  784. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  785. package/src/service-queues/queue-list/queue-list.component.scss +37 -0
  786. package/src/service-queues/queue-list/queue-list.component.tsx +296 -60
  787. package/src/service-queues/service-queue/service-queue.component.tsx +151 -8
  788. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +5 -0
  789. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +36 -7
  790. package/src/service-queues/service-queue.tsx +22 -16
  791. package/src/service-queues/service-queues.resource.ts +293 -2
  792. package/src/service-queues/service.resource.ts +1 -1
  793. package/src/shared/constants/concepts.ts +70 -0
  794. package/src/shared/constants/patient-category.ts +6 -0
  795. package/src/shared/constants/patient-type.ts +10 -0
  796. package/src/shared/constants/visit-types.ts +9 -0
  797. package/src/shared/services/billable-service.resource.ts +121 -0
  798. package/src/shared/services/billing.resource.ts +112 -0
  799. package/src/shared/services/claims.resource.ts +47 -0
  800. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  801. package/src/shared/services/client-payment.resource.ts +17 -0
  802. package/src/shared/services/consultation-clearance.resource.ts +210 -0
  803. package/src/shared/services/eligibility.resource.ts +20 -0
  804. package/src/shared/services/encounters.resource.ts +33 -0
  805. package/src/shared/types/index.ts +156 -0
  806. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  807. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  808. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  809. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  810. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.scss +39 -0
  811. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.tsx +19 -0
  812. package/src/shared/ui/otp-input/otp-input.component.scss +12 -12
  813. package/src/shared/ui/otp-input/otp-input.component.tsx +13 -6
  814. package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.tsx +6 -3
  815. package/src/shared/utils/format-title-case.ts +8 -0
  816. package/src/shared/utils/get-base-url.ts +15 -0
  817. package/src/shared/utils/get-tag-type.ts +75 -0
  818. package/src/shr/shr-close-visit-form.component.tsx +102 -0
  819. package/src/shr/shr-code-systems.json +363 -0
  820. package/src/shr/shr-terminology.resource.test.ts +66 -0
  821. package/src/shr/shr-terminology.resource.ts +64 -0
  822. package/src/shr/shr-viewer/shr-categories.test.ts +241 -0
  823. package/src/shr/shr-viewer/shr-categories.ts +209 -0
  824. package/src/shr/shr-viewer/shr-presentation.test.ts +511 -0
  825. package/src/shr/shr-viewer/shr-presentation.ts +883 -0
  826. package/src/shr/shr-viewer/shr-viewer.component.test.tsx +176 -0
  827. package/src/shr/shr-viewer/shr-viewer.component.tsx +432 -0
  828. package/src/shr/shr-viewer/shr-viewer.scss +239 -0
  829. package/src/shr/shr-visit-sync.test.ts +88 -0
  830. package/src/shr/shr-visit-sync.ts +62 -0
  831. package/src/shr/shr.component.tsx +730 -0
  832. package/src/shr/shr.resource.test.ts +737 -0
  833. package/src/shr/shr.resource.ts +463 -0
  834. package/src/shr/shr.scss +114 -0
  835. package/src/shr/shr.types.ts +682 -0
  836. package/src/shr/workspaces/shr-consent-workspace/schema.ts +53 -0
  837. package/src/shr/workspaces/shr-consent-workspace/shr-consent.scss +71 -0
  838. package/src/shr/workspaces/shr-consent-workspace/shr-consent.workspace.tsx +686 -0
  839. package/src/side-nav-menu/accounting-nav-link-config.ts +16 -0
  840. package/src/side-nav-menu/accounting-nav-links.tsx +42 -0
  841. package/src/side-nav-menu/critical-care-nav-links.tsx +42 -0
  842. package/src/side-nav-menu/critical-care-unit-nav-link-config.ts +28 -0
  843. package/src/side-nav-menu/mnch-nav-link-config.ts +16 -0
  844. package/src/side-nav-menu/mnch-nav-links.tsx +42 -0
  845. package/src/side-nav-menu/nav-link-config.ts +5 -5
  846. package/src/side-nav-menu/specialized-clinics-nav-link-config.ts +32 -0
  847. package/src/side-nav-menu/specialized-clinics-nav-links.tsx +42 -0
  848. package/src/specialized-clinics/dental/dental-queues.component.scss +7 -0
  849. package/src/specialized-clinics/dental/dental-queues.component.tsx +36 -0
  850. package/src/specialized-clinics/dental/queues/consultation/dental-consultation.tsx +15 -0
  851. package/src/specialized-clinics/dental/queues/triage/dental-triage.tsx +15 -0
  852. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.scss +7 -0
  853. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.tsx +36 -0
  854. package/src/specialized-clinics/diagnostic-and-imaging/queues/consultation/diagnosis-and-imaging-consultation.tsx +15 -0
  855. package/src/specialized-clinics/diagnostic-and-imaging/queues/triage/diagnosis-and-imaging-triage.tsx +15 -0
  856. package/src/specialized-clinics/oncology/oncology-queues.component.scss +7 -0
  857. package/src/specialized-clinics/oncology/oncology-queues.component.tsx +36 -0
  858. package/src/specialized-clinics/oncology/queues/consultation/oncology-consultation.tsx +15 -0
  859. package/src/specialized-clinics/oncology/queues/triage/oncology-triage.tsx +15 -0
  860. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.scss +7 -0
  861. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.tsx +36 -0
  862. package/src/specialized-clinics/ophthalmology/queues/consultation/ophthalmology-consultation.tsx +15 -0
  863. package/src/specialized-clinics/ophthalmology/queues/triage/ophthalmology-triage.tsx +15 -0
  864. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.scss +7 -0
  865. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.tsx +36 -0
  866. package/src/specialized-clinics/psychiatry/queues/consultation/psychiatry-consultation.tsx +15 -0
  867. package/src/specialized-clinics/psychiatry/queues/triage/psychiatry-triage.tsx +15 -0
  868. package/src/specialized-clinics/renal/queues/consultation/dialysis-consultation.tsx +15 -0
  869. package/src/specialized-clinics/renal/queues/triage/renal-triage.tsx +15 -0
  870. package/src/specialized-clinics/renal/renal-queues.component.scss +7 -0
  871. package/src/specialized-clinics/renal/renal-queues.component.tsx +36 -0
  872. package/src/specialized-clinics/specialized-clinics-root.tsx +25 -0
  873. package/src/telemedicine/telemedicine-patient-chart.component.test.tsx +123 -0
  874. package/src/telemedicine/telemedicine-patient-chart.component.tsx +131 -0
  875. package/src/telemedicine/telemedicine.component.test.tsx +113 -0
  876. package/src/telemedicine/telemedicine.component.tsx +310 -0
  877. package/src/telemedicine/telemedicine.resource.test.ts +171 -0
  878. package/src/telemedicine/telemedicine.resource.ts +125 -0
  879. package/src/telemedicine/telemedicine.scss +91 -0
  880. package/src/triage/triage.component.scss +6 -0
  881. package/src/triage/triage.component.tsx +4 -0
  882. package/src/types/types.ts +56 -1
  883. package/tools/fetch-shr-code-systems.mjs +135 -0
  884. package/tools/strip-openmrs-declaration-maps.mjs +44 -0
  885. package/tools/update-openmrs-deps.mjs +36 -5
  886. package/translations/en.json +135 -0
  887. package/tsconfig.json +7 -4
  888. package/webpack.config.js +74 -1
  889. package/dist/104.js +0 -2
  890. package/dist/104.js.map +0 -1
  891. package/dist/145.js +0 -1
  892. package/dist/145.js.map +0 -1
  893. package/dist/15.js +0 -1
  894. package/dist/15.js.map +0 -1
  895. package/dist/184.js +0 -2
  896. package/dist/184.js.map +0 -1
  897. package/dist/246.js +0 -2
  898. package/dist/246.js.map +0 -1
  899. package/dist/255.js +0 -1
  900. package/dist/255.js.map +0 -1
  901. package/dist/28.js +0 -1
  902. package/dist/28.js.map +0 -1
  903. package/dist/300.js +0 -1
  904. package/dist/321.js +0 -1
  905. package/dist/321.js.map +0 -1
  906. package/dist/327.js +0 -1
  907. package/dist/327.js.map +0 -1
  908. package/dist/339.js +0 -1
  909. package/dist/339.js.map +0 -1
  910. package/dist/353.js +0 -1
  911. package/dist/353.js.map +0 -1
  912. package/dist/420.js +0 -1
  913. package/dist/420.js.map +0 -1
  914. package/dist/540.js +0 -2
  915. package/dist/540.js.map +0 -1
  916. package/dist/55.js +0 -1
  917. package/dist/709.js +0 -1
  918. package/dist/709.js.map +0 -1
  919. package/dist/710.js +0 -2
  920. package/dist/710.js.LICENSE.txt +0 -14
  921. package/dist/710.js.map +0 -1
  922. package/dist/717.js +0 -1
  923. package/dist/717.js.map +0 -1
  924. package/dist/729.js +0 -1
  925. package/dist/729.js.map +0 -1
  926. package/dist/752.js +0 -1
  927. package/dist/752.js.map +0 -1
  928. package/dist/833.js +0 -1
  929. package/dist/833.js.map +0 -1
  930. package/dist/93.js +0 -1
  931. package/dist/93.js.map +0 -1
  932. package/dist/964.js +0 -1
  933. package/dist/964.js.map +0 -1
  934. package/dist/99.js +0 -1
  935. /package/dist/{104.js.LICENSE.txt → 2272.js.LICENSE.txt} +0 -0
  936. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  937. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
  938. /package/src/{pharmacy-dashboard.meta.ts → dashboard-meta/pharmacy-dashboard.meta.ts} +0 -0
  939. /package/src/{queue-dashboard.meta.ts → dashboard-meta/queue-dashboard.meta.ts} +0 -0
  940. /package/src/{triage-dashboard.meta.ts → dashboard-meta/triage-dashboard.meta.ts} +0 -0
  941. /package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.scss +0 -0
@@ -0,0 +1,1549 @@
1
+ import { openmrsFetch, restBaseUrl, type Visit } from '@openmrs/esm-framework';
2
+ import dayjs from 'dayjs';
3
+ import { useState } from 'react';
4
+ import useSWR from 'swr';
5
+ import { fetchFacilityPreauthBills, fetchPatientFacilityBillDetails } from '../../../billing-claims.resource';
6
+ import { fetchShaInterventionByCode } from '../../../../claims/claims.resource';
7
+ import { type Intervention } from '../../../../claims';
8
+ import { IdentifierTypesUuids } from '../../../../resources/identifier-types';
9
+ import { type PatientFacilityBillDetails } from '../types';
10
+ import { getConsentToken } from '../../../../shared/services/claims.resource';
11
+ import {
12
+ BILLABLE_SERVICE_PICKER_REPRESENTATION,
13
+ fetchBillableServicePage,
14
+ useBillableServiceLocationUuid,
15
+ } from '../../../../shared/services/billable-service.resource';
16
+
17
+ const PREAUTH_CODE_KEY = 'ampath.preauthCode';
18
+
19
+ export const asBool = (v: unknown): boolean => {
20
+ if (typeof v === 'boolean') return v;
21
+ if (typeof v === 'number') return v === 1;
22
+ if (typeof v === 'string') {
23
+ const s = v.trim().toLowerCase();
24
+ return s === 'true' || s === '1' || s === 'yes';
25
+ }
26
+ return false;
27
+ };
28
+
29
+ /** Score how well a billable_service name matches an intervention / service hint. */
30
+ function scoreBillableServiceMatch(billableService: string | null | undefined, hint: string | null | undefined): number {
31
+ const a = (billableService ?? '').toLowerCase().trim();
32
+ const b = (hint ?? '').toLowerCase().trim();
33
+ if (!a || !b) return 0;
34
+ if (a === b) return 100;
35
+ if (a.includes(b) || b.includes(a)) return 80;
36
+ const tokensA = a.split(/[^a-z0-9]+/).filter((t) => t.length > 2);
37
+ const tokensB = b.split(/[^a-z0-9]+/).filter((t) => t.length > 2);
38
+ if (!tokensA.length || !tokensB.length) return 0;
39
+ const overlap = tokensA.filter((t) => tokensB.includes(t)).length;
40
+ return overlap * 15;
41
+ }
42
+
43
+ /**
44
+ * Pick the bill line for a preauth intervention.
45
+ * Same intervention_code can appear on multiple lines (e.g. HEMOGLOBIN + HEMODIALYSIS) —
46
+ * prefer the line whose billable_service best matches the service hint / intervention name.
47
+ */
48
+ export function pickBillLineForIntervention(
49
+ bills: PatientFacilityBillDetails[],
50
+ interventionCode: string,
51
+ serviceHint?: string | null,
52
+ ): PatientFacilityBillDetails | null {
53
+ const code = (interventionCode ?? '').trim();
54
+ if (!code || !bills?.length) return null;
55
+
56
+ const byCode = bills.filter((b) => (b.intervention_code ?? '').trim() === code);
57
+ if (!byCode.length) return null;
58
+
59
+ let best: PatientFacilityBillDetails = byCode[0];
60
+ let bestRanked = -1;
61
+ for (const line of byCode) {
62
+ const score = scoreBillableServiceMatch(line.billable_service, serviceHint);
63
+ const price = Number(line.item_price ?? 0) || 0;
64
+ // Name match dominates; among ties prefer higher item_price.
65
+ const ranked = score * 1_000_000 + price;
66
+ if (ranked > bestRanked) {
67
+ bestRanked = ranked;
68
+ best = line;
69
+ }
70
+ }
71
+ return best;
72
+ }
73
+
74
+ export function unitPriceFromBillLine(line: PatientFacilityBillDetails | null | undefined): string {
75
+ if (!line) return '';
76
+ const price = line.item_price ?? line.item_total_price;
77
+ if (price == null || price === ('' as unknown)) return '';
78
+ const n = Number(price);
79
+ return Number.isFinite(n) ? String(n) : String(price).trim();
80
+ }
81
+
82
+ /** SHA coverage flags for an intervention_code (from interventions coverage API). */
83
+ export type ShaInterventionPreauthFlags = {
84
+ needsPreauth: boolean;
85
+ needsManualPreauthApproval: boolean;
86
+ intervention?: Intervention | null;
87
+ };
88
+
89
+ /**
90
+ * Bill lines that need elective preauth (`needsManualPreauthApproval`) and are not yet approved.
91
+ */
92
+ export const needsElectivePreauth = (item: PatientFacilityBillDetails): boolean => {
93
+ if (!item?.intervention_code) {
94
+ return false;
95
+ }
96
+ if (asBool(item.preauth_approved)) {
97
+ return false;
98
+ }
99
+ if (item.elective_preauth != null) {
100
+ return asBool(item.elective_preauth);
101
+ }
102
+ return false;
103
+ };
104
+
105
+ /**
106
+ * Bill lines that need normal (non-elective) preauth and are not yet approved.
107
+ * Prefer ETL flags when present; otherwise use SHA intervention coverage for the
108
+ * bill's `intervention_code` (`needsPreauth` && !`needsManualPreauthApproval`).
109
+ * @see https://hie-docs.dha.go.ke/docs/claims/process/preauths/normalPreauths
110
+ */
111
+ export const needsNormalPreauth = (
112
+ item: PatientFacilityBillDetails,
113
+ sha?: ShaInterventionPreauthFlags | null,
114
+ ): boolean => {
115
+ if (!item?.intervention_code) {
116
+ return false;
117
+ }
118
+ if (asBool(item.preauth_approved)) {
119
+ return false;
120
+ }
121
+ // Elective is a separate queue / workspace mode
122
+ if (asBool(item.elective_preauth)) {
123
+ return false;
124
+ }
125
+ // Prefer explicit ETL flags when the bill payload includes them
126
+ if (item.requires_preauth != null) {
127
+ return asBool(item.requires_preauth) && !asBool(item.elective_preauth);
128
+ }
129
+ if (item.normal_preauth != null) {
130
+ return asBool(item.normal_preauth);
131
+ }
132
+ // Facility bill lines often omit ETL flags — use SHA coverage for intervention_code
133
+ if (sha) {
134
+ return Boolean(sha.needsPreauth) && !Boolean(sha.needsManualPreauthApproval);
135
+ }
136
+ return false;
137
+ };
138
+
139
+ /**
140
+ * Resolve normal-preauth need for a bill line via SHA interventions coverage
141
+ * using `cr_no` + `intervention_code` (+ optional `subBenefitCode` from claim visit).
142
+ */
143
+ export async function resolveNormalPreauthForBillItem(
144
+ item: PatientFacilityBillDetails,
145
+ locationUuid: string,
146
+ subBenefitCode?: string,
147
+ ): Promise<ShaInterventionPreauthFlags | null> {
148
+ const code = (item.intervention_code ?? '').trim();
149
+ const patientId = (item.cr_no ?? '').trim();
150
+ if (!code || !patientId || !locationUuid) {
151
+ return null;
152
+ }
153
+ try {
154
+ const intervention = await fetchShaInterventionByCode(
155
+ patientId,
156
+ locationUuid,
157
+ code,
158
+ subBenefitCode,
159
+ );
160
+ if (!intervention) {
161
+ return { needsPreauth: false, needsManualPreauthApproval: false, intervention: null };
162
+ }
163
+ return {
164
+ needsPreauth: Boolean(intervention.needsPreauth),
165
+ needsManualPreauthApproval: Boolean(intervention.needsManualPreauthApproval),
166
+ intervention,
167
+ };
168
+ } catch {
169
+ return null;
170
+ }
171
+ }
172
+
173
+ export async function fetchActiveVisitForPatient(patientUuid: string, locationUuid?: string): Promise<Visit | null> {
174
+ if (!patientUuid) {
175
+ return null;
176
+ }
177
+ const params = new URLSearchParams({
178
+ patient: patientUuid,
179
+ includeInactive: 'false',
180
+ fromStartDate: dayjs().startOf('day').toISOString(),
181
+ v: 'full',
182
+ limit: '1',
183
+ });
184
+ if (locationUuid) {
185
+ params.set('location', locationUuid);
186
+ }
187
+ const response = await openmrsFetch(`${restBaseUrl}/visit?${params.toString()}`);
188
+ const results = response?.data?.results as Visit[] | undefined;
189
+ return results?.[0] ?? null;
190
+ }
191
+
192
+ export async function resolvePatientUuidFromCr(crNumber: string | null | undefined): Promise<string> {
193
+ const identifier = String(crNumber ?? '').trim();
194
+ if (!identifier) return '';
195
+ try {
196
+ const qs = new URLSearchParams({
197
+ identifier,
198
+ v: 'custom:(uuid,identifiers:(identifier))',
199
+ });
200
+ const res = await openmrsFetch(`${restBaseUrl}/patient?${qs.toString()}`);
201
+ const results = (res?.data?.results ?? []) as Array<{ uuid?: string }>;
202
+ return String(results[0]?.uuid ?? '').trim();
203
+ } catch {
204
+ return '';
205
+ }
206
+ }
207
+
208
+ export async function fetchNormalPreauthBillItems(
209
+ locationUuid: string,
210
+ billingDate: string,
211
+ ): Promise<PatientFacilityBillDetails[]> {
212
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
213
+ // Dedicated `/facility/pre-auth-bills` already returns preauth candidates; still drop
214
+ // elective / already-approved / lines without an intervention code.
215
+ return (results ?? []).filter((item) => {
216
+ if (!item?.intervention_code) return false;
217
+ if (asBool(item.preauth_approved)) return false;
218
+ if (asBool(item.elective_preauth)) return false;
219
+ if (item.requires_preauth != null || item.normal_preauth != null) {
220
+ return needsNormalPreauth(item);
221
+ }
222
+ return true;
223
+ });
224
+ }
225
+
226
+ export async function fetchElectivePreauthBillItems(
227
+ locationUuid: string,
228
+ billingDate: string,
229
+ ): Promise<PatientFacilityBillDetails[]> {
230
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
231
+ return (results ?? []).filter((item) => needsElectivePreauth(item));
232
+ }
233
+
234
+ export async function fetchPreauthBillItems(
235
+ locationUuid: string,
236
+ billingDate: string,
237
+ ): Promise<PatientFacilityBillDetails[]> {
238
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
239
+ return (results ?? []).filter((item) => {
240
+ if (!item?.intervention_code) return false;
241
+ if (asBool(item.preauth_approved)) return false;
242
+ if (asBool(item.elective_preauth)) return true;
243
+ if (item.requires_preauth != null || item.normal_preauth != null) {
244
+ return needsNormalPreauth(item);
245
+ }
246
+ return true;
247
+ });
248
+ }
249
+
250
+ export function resolveConsentTokenForVisit(visit: Visit | null | undefined): string {
251
+ if (!visit) return '';
252
+ return getConsentToken(visit);
253
+ }
254
+
255
+ export function storePreauthCode(consentToken: string, interventionCode: string, preauthCode: string) {
256
+ try {
257
+ const raw = sessionStorage.getItem(PREAUTH_CODE_KEY);
258
+ const map = raw ? (JSON.parse(raw) as Record<string, string>) : {};
259
+ map[`${consentToken}::${interventionCode}`] = preauthCode;
260
+ sessionStorage.setItem(PREAUTH_CODE_KEY, JSON.stringify(map));
261
+ } catch {
262
+ // ignore
263
+ }
264
+ }
265
+
266
+ export function getStoredPreauthCode(consentToken: string, interventionCode: string): string | undefined {
267
+ try {
268
+ const raw = sessionStorage.getItem(PREAUTH_CODE_KEY);
269
+ if (!raw) return undefined;
270
+ const map = JSON.parse(raw) as Record<string, string>;
271
+ return map[`${consentToken}::${interventionCode}`];
272
+ } catch {
273
+ return undefined;
274
+ }
275
+ }
276
+
277
+ export function parseDocTypes(csv?: string | null): string[] {
278
+ if (!csv) return [];
279
+ return csv
280
+ .split(',')
281
+ .map((s) => s.trim())
282
+ .filter(Boolean);
283
+ }
284
+
285
+ export function interventionFlagsFromBillItem(item: PatientFacilityBillDetails) {
286
+ return {
287
+ code: item.intervention_code,
288
+ ...readSpecialtyFlags(item),
289
+ requiredPreauthDocumentTypes: parseDocTypes(item.required_preauth_document_types),
290
+ applicableDocumentTypes: parseDocTypes(item.applicable_document_types),
291
+ };
292
+ }
293
+
294
+ /** Specialty flags from visit/SHA/bill payloads (snake_case or camelCase). */
295
+ export function readSpecialtyFlags(source: unknown): {
296
+ requiresSurgicalPreauth: boolean;
297
+ requiresRenalPreauth: boolean;
298
+ requiresOncologyPreauth: boolean;
299
+ requiresRadiologyPreauth: boolean;
300
+ requiresOpticalPreauth: boolean;
301
+ } {
302
+ const s = (source ?? {}) as Record<string, unknown>;
303
+ return {
304
+ requiresSurgicalPreauth: asBool(s.requiresSurgicalPreauth ?? s.requires_surgical_preauth),
305
+ requiresRenalPreauth: asBool(s.requiresRenalPreauth ?? s.requires_renal_preauth),
306
+ requiresOncologyPreauth: asBool(s.requiresOncologyPreauth ?? s.requires_oncology_preauth),
307
+ requiresRadiologyPreauth: asBool(s.requiresRadiologyPreauth ?? s.requires_radiology_preauth),
308
+ requiresOpticalPreauth: asBool(s.requiresOpticalPreauth ?? s.requires_optical_preauth),
309
+ };
310
+ }
311
+
312
+ export function mergeSpecialtyFlags(
313
+ ...sources: Array<ReturnType<typeof readSpecialtyFlags> | null | undefined>
314
+ ): ReturnType<typeof readSpecialtyFlags> {
315
+ return sources.reduce(
316
+ (acc, src) => ({
317
+ requiresSurgicalPreauth: acc.requiresSurgicalPreauth || !!src?.requiresSurgicalPreauth,
318
+ requiresRenalPreauth: acc.requiresRenalPreauth || !!src?.requiresRenalPreauth,
319
+ requiresOncologyPreauth: acc.requiresOncologyPreauth || !!src?.requiresOncologyPreauth,
320
+ requiresRadiologyPreauth: acc.requiresRadiologyPreauth || !!src?.requiresRadiologyPreauth,
321
+ requiresOpticalPreauth: acc.requiresOpticalPreauth || !!src?.requiresOpticalPreauth,
322
+ }),
323
+ {
324
+ requiresSurgicalPreauth: false,
325
+ requiresRenalPreauth: false,
326
+ requiresOncologyPreauth: false,
327
+ requiresRadiologyPreauth: false,
328
+ requiresOpticalPreauth: false,
329
+ },
330
+ );
331
+ }
332
+
333
+ export function preauthFormLabel(flags: {
334
+ requiresSurgicalPreauth?: boolean;
335
+ requiresRenalPreauth?: boolean;
336
+ requiresOncologyPreauth?: boolean;
337
+ requiresRadiologyPreauth?: boolean;
338
+ requiresOpticalPreauth?: boolean;
339
+ }): string {
340
+ if (flags.requiresSurgicalPreauth) return 'Surgical';
341
+ if (flags.requiresRenalPreauth) return 'Renal';
342
+ if (flags.requiresOncologyPreauth) return 'Oncology';
343
+ if (flags.requiresRadiologyPreauth) return 'Imaging';
344
+ if (flags.requiresOpticalPreauth) return 'Optical';
345
+ return 'Normal';
346
+ }
347
+
348
+ export type PreauthInterventionProps = {
349
+ code: string;
350
+ name?: string;
351
+ requiresSurgicalPreauth?: boolean;
352
+ requiresRenalPreauth?: boolean;
353
+ requiresOncologyPreauth?: boolean;
354
+ requiresRadiologyPreauth?: boolean;
355
+ requiresOpticalPreauth?: boolean;
356
+ requiredPreauthDocumentTypes?: string[];
357
+ applicableDocumentTypes?: string[];
358
+ };
359
+
360
+ export const GENERATABLE_DOC_TYPES = new Set(['DISCHARGE_SUMMARY', 'INVOICE', 'FINAL_BILL']);
361
+
362
+ export type OpenMrsProviderHit = {
363
+ uuid: string;
364
+ display: string;
365
+ identifier?: string;
366
+ /** From provider attribute type PROVIDER_NATIONAL_ID_UUID (National ID card) */
367
+ nationalId?: string;
368
+ person?: { display?: string; uuid?: string };
369
+ };
370
+
371
+ function extractProviderNationalId(
372
+ attributes?: Array<{ value?: string; voided?: boolean; attributeType?: { uuid?: string } }>,
373
+ ): string | undefined {
374
+ const hit = (attributes ?? []).find(
375
+ (a) => !a.voided && a.attributeType?.uuid === IdentifierTypesUuids.PROVIDER_NATIONAL_ID_UUID && a.value,
376
+ );
377
+ return hit?.value ? String(hit.value).trim() : undefined;
378
+ }
379
+
380
+ export async function searchOpenMrsProviders(q: string): Promise<OpenMrsProviderHit[]> {
381
+ if (!q || q.trim().length < 2) {
382
+ return [];
383
+ }
384
+ const url = `${restBaseUrl}/provider?q=${encodeURIComponent(q.trim())}&v=custom:(uuid,display,identifier,person:(uuid,display),attributes:(uuid,value,voided,attributeType:(uuid)))`;
385
+ const response = await openmrsFetch(url);
386
+ const results = (response?.data?.results as Array<OpenMrsProviderHit & { attributes?: any[] }>) ?? [];
387
+ return results.map((p) => ({
388
+ uuid: p.uuid,
389
+ display: p.display,
390
+ identifier: p.identifier,
391
+ person: p.person,
392
+ nationalId: extractProviderNationalId(p.attributes),
393
+ }));
394
+ }
395
+
396
+ /** ICD-11 concept source used by AMRS / ETL patient diagnosis (claims-and-billing). */
397
+ export const ICD11_CONCEPT_SOURCE_UUID = '43aaca5f-d623-43fd-993b-673b5d927cdd';
398
+
399
+ export type DiagnosisConceptHit = {
400
+ uuid: string;
401
+ display: string;
402
+ icd11Code: string;
403
+ };
404
+
405
+ type ConceptMappingLike = {
406
+ display?: string;
407
+ conceptReferenceTerm?: {
408
+ code?: string;
409
+ name?: string;
410
+ conceptSource?: { uuid?: string; name?: string; hl7Code?: string };
411
+ };
412
+ };
413
+
414
+ function extractIcd11CodeFromConcept(concept: {
415
+ mappings?: ConceptMappingLike[];
416
+ }): string {
417
+ for (const m of concept.mappings ?? []) {
418
+ const term = m.conceptReferenceTerm;
419
+ if (!term) continue;
420
+ const source = term.conceptSource ?? {};
421
+ const sourceUuid = String(source.uuid ?? '');
422
+ const sourceName = String(source.name ?? '').toUpperCase();
423
+ const hl7 = String(source.hl7Code ?? '').toUpperCase();
424
+ if (
425
+ sourceUuid === ICD11_CONCEPT_SOURCE_UUID ||
426
+ sourceName.includes('ICD-11') ||
427
+ sourceName.includes('ICD11') ||
428
+ hl7 === 'ICD11' ||
429
+ hl7.includes('ICD-11')
430
+ ) {
431
+ const code = String(term.code ?? '').trim();
432
+ if (code) return code;
433
+ }
434
+ }
435
+ for (const m of concept.mappings ?? []) {
436
+ const display = String(m.display ?? '');
437
+ if (/ICD-?11/i.test(display)) {
438
+ const code = display.split(':').pop()?.trim();
439
+ if (code) return code;
440
+ }
441
+ }
442
+ return '';
443
+ }
444
+
445
+ /**
446
+ * Search the OpenMRS concept dictionary for ICD-11–mapped diagnosis concepts.
447
+ * Used when the clerk types in Raise Preauth (visit diagnoses still prefill the list).
448
+ */
449
+ export async function searchDiagnosisConcepts(q: string): Promise<DiagnosisConceptHit[]> {
450
+ const term = (q ?? '').trim();
451
+ if (term.length < 2) {
452
+ return [];
453
+ }
454
+ const params = new URLSearchParams({
455
+ q: term,
456
+ limit: '25',
457
+ v: 'custom:(uuid,display,mappings:(display,conceptReferenceTerm:(uuid,code,name,conceptSource:(uuid,name,hl7Code))))',
458
+ });
459
+ const response = await openmrsFetch(`${restBaseUrl}/concept?${params.toString()}`);
460
+ const results = (response?.data?.results as Array<{
461
+ uuid: string;
462
+ display: string;
463
+ mappings?: ConceptMappingLike[];
464
+ }>) ?? [];
465
+
466
+ const hits: DiagnosisConceptHit[] = [];
467
+ const seen = new Set<string>();
468
+ for (const c of results) {
469
+ const icd11Code = extractIcd11CodeFromConcept(c);
470
+ if (!icd11Code) continue;
471
+ const key = `${icd11Code}|${c.uuid}`;
472
+ if (seen.has(key)) continue;
473
+ seen.add(key);
474
+ hits.push({
475
+ uuid: c.uuid,
476
+ display: c.display || icd11Code,
477
+ icd11Code,
478
+ });
479
+ }
480
+ return hits;
481
+ }
482
+
483
+ export type HwrSearchResult = {
484
+ membership?: {
485
+ id?: string;
486
+ full_name?: string;
487
+ registration_id?: string;
488
+ licensing_body?: string;
489
+ specialty?: string;
490
+ status?: string;
491
+ external_reference_id?: string;
492
+ };
493
+ contacts?: { email?: string; phone?: string };
494
+ identifiers?: {
495
+ identification_type?: string;
496
+ identification_number?: string;
497
+ client_registry_id?: string;
498
+ };
499
+ };
500
+
501
+ /** GET {hieBaseUrl}/practitioner/search */
502
+ export async function searchHealthWorkerRegistry(params: {
503
+ identifierType: string;
504
+ identifierValue: string;
505
+ locationUuid: string;
506
+ }): Promise<HwrSearchResult[]> {
507
+ const { getHieBaseUrl } = await import('../../../../claims/utils');
508
+ const { hieBaseUrl } = await getHieBaseUrl();
509
+ const qs = new URLSearchParams({
510
+ identifierType: params.identifierType,
511
+ identifierValue: params.identifierValue,
512
+ locationUuid: params.locationUuid,
513
+ });
514
+ const response = await openmrsFetch(`${hieBaseUrl}/practitioner/search?${qs.toString()}`);
515
+ const data = response?.data;
516
+ if (Array.isArray(data)) {
517
+ // Backend may return HealthWokerApiResponse[] with { message } wrappers
518
+ return data.map((row: any) => row?.message ?? row).filter(Boolean);
519
+ }
520
+ if (data?.message) {
521
+ return [data.message];
522
+ }
523
+ return data ? [data] : [];
524
+ }
525
+
526
+ export function billingDateToVisitDate(billDate?: string): string {
527
+ if (!billDate) {
528
+ return dayjs().format('YYYY-MM-DD');
529
+ }
530
+ // "2026-07-23 12:16" or ISO
531
+ const d = dayjs(billDate);
532
+ return d.isValid() ? d.format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD');
533
+ }
534
+
535
+ /**
536
+ * Load patient facility bill lines and resolve unit_price for the intervention.
537
+ * Handles multiple lines sharing one intervention_code by matching billable_service.
538
+ */
539
+ export async function resolveUnitPriceFromPatientBills(params: {
540
+ patientUuid: string;
541
+ locationUuid: string;
542
+ billingDate?: string;
543
+ interventionCode: string;
544
+ serviceHint?: string | null;
545
+ }): Promise<{ unitPrice: string; billLine: PatientFacilityBillDetails | null }> {
546
+ const patientUuid = (params.patientUuid ?? '').trim();
547
+ const locationUuid = (params.locationUuid ?? '').trim();
548
+ const interventionCode = (params.interventionCode ?? '').trim();
549
+ if (!patientUuid || !locationUuid || !interventionCode) {
550
+ return { unitPrice: '', billLine: null };
551
+ }
552
+ try {
553
+ const billingDate = billingDateToVisitDate(params.billingDate);
554
+ const bills = await fetchPatientFacilityBillDetails({
555
+ patientUuid,
556
+ locationUuid,
557
+ billingDate,
558
+ });
559
+ const line = pickBillLineForIntervention(bills ?? [], interventionCode, params.serviceHint);
560
+ return { unitPrice: unitPriceFromBillLine(line), billLine: line };
561
+ } catch {
562
+ return { unitPrice: '', billLine: null };
563
+ }
564
+ }
565
+
566
+ /** Build service_start/service_end ISO. `timeOrEndOfDay` may be "HH:mm" / "HH:mm:ss", or true for end-of-day. */
567
+ export function dateToServiceIso(date: Date | undefined, timeOrEndOfDay: string | boolean = false): string {
568
+ if (!date || Number.isNaN(date.getTime())) {
569
+ return dayjs().format('YYYY-MM-DDTHH:mm:ssZ');
570
+ }
571
+ if (typeof timeOrEndOfDay === 'string') {
572
+ const parts = timeOrEndOfDay.split(':').map((p) => Number(p));
573
+ const [h = 0, m = 0, s = 0] = parts;
574
+ return dayjs(date).hour(h).minute(m).second(s).format('YYYY-MM-DDTHH:mm:ssZ');
575
+ }
576
+ const d = timeOrEndOfDay
577
+ ? dayjs(date).hour(23).minute(59).second(0)
578
+ : dayjs(date).hour(8).minute(0).second(0);
579
+ return d.format('YYYY-MM-DDTHH:mm:ssZ');
580
+ }
581
+
582
+ /** POC Pre-authorization Form encounter type. */
583
+ export const PREAUTH_FORM_UUID = 'cce578f6-b3e2-3077-91ab-9016cf0f4fa5';
584
+ export const PREAUTH_ENCOUNTER_TYPE_UUID = '18b10189-a89f-430d-83e9-14663fef258c';
585
+ /** Clinical encounter type — alternate source for Raise prefill (dx / notes / provider). */
586
+ export const CLINICAL_ENCOUNTER_TYPE_UUID = '81166f83-1ee6-486e-8f56-aca528fc0fc0';
587
+ /** OPD Triage — source for surgical vital_signs concat from today's visit. */
588
+ export const OPD_TRIAGE_ENCOUNTER_TYPE_UUID = '8a43b09b-2d9f-487c-a1c3-d6bf220671a7';
589
+
590
+ /** Clinical notes / indications concept — same UUID as admissions clinical notes. */
591
+ export const CLINICAL_INDICATIONS_CONCEPT_UUID = '5e4dc798-2cce-4a1a-97e9-bcf22d64b07c';
592
+
593
+ /** POC OPD Triage Vital Signs section concepts. */
594
+ export const TRIAGE_VITALS_CONCEPTS = {
595
+ temperature: 'a8a65fee-1350-11df-a1f1-0026b9348838',
596
+ pulse: 'a8a65f12-1350-11df-a1f1-0026b9348838',
597
+ systolicBp: 'a8a65d5a-1350-11df-a1f1-0026b9348838',
598
+ diastolicBp: 'a8a65e36-1350-11df-a1f1-0026b9348838',
599
+ respiratoryRate: 'a8a6f71a-1350-11df-a1f1-0026b9348838',
600
+ oxygenSaturation: 'a8a66354-1350-11df-a1f1-0026b9348838',
601
+ } as const;
602
+
603
+ export const PREAUTH_FORM_CONCEPTS = {
604
+ typeOfIntervention: 'aea44bfb-c8b1-4cce-b891-af74181d0f57',
605
+ clinicalIndication: CLINICAL_INDICATIONS_CONCEPT_UUID,
606
+ startDate: 'bb85532e-8f7e-476f-81d7-5580e0385852',
607
+ /** Same concept as startDate — stores elective expected service start on the preauth encounter. */
608
+ expectedServiceStartDate: 'bb85532e-8f7e-476f-81d7-5580e0385852',
609
+ sessionNumber: '86f4e2e2-c2e8-4d0b-9ed7-34900d55ae09',
610
+ frequencyOfSessions: 'a40396d3-3f9b-49b6-902a-a804f3d0e2a0',
611
+ clinicalIndicationRenal: '85b45e49-2428-4898-b9f8-62a1b8a4b4e4',
612
+ newRequest: 'aad64a84-1a63-47e3-a806-fb704b52b709',
613
+ lens: 'f0e18a8e-5912-4b5b-aae0-6f83b5de77af',
614
+ eyeExaminationAmount: 'a04a2d91-e540-45d4-a650-70bf4cab0b3f',
615
+ frameAmount: '424b5c35-f37f-4ec7-8b4a-a64c34c5f5ef',
616
+ lensAmount: '2dfe99ac-b32b-4cb9-b6e7-8e557a43624b',
617
+ complaintGroup: '9014962e-3efe-46b0-a393-c8c8bddadaa7',
618
+ complaint: 'a8a6ddb6-1350-11df-a1f1-0026b9348838',
619
+ otherComplaint: 'a8a06fc6-1350-11df-a1f1-0026b9348838',
620
+ hpi: '9e903280-385f-473d-9dfb-01bdb6b661a5',
621
+ generalExam: 'a8a0cc32-1350-11df-a1f1-0026b9348838',
622
+ investigation: '7b64016c-ae2d-4ec1-bdc1-e920b0e94b9d',
623
+ anaesthesia: '2ea4944e-51e4-52c7-a209-8dcc2e889054',
624
+ employmentRelated: '7dcf0456-a9ec-42d3-aa75-d406d3e5abb1',
625
+ accidentRelated: '855b3a01-53c9-4129-923d-79863d318580',
626
+ coInsured: '415dbca0-2d9b-4d6a-98b7-b855a023cbbb',
627
+ coInsuredDetails: '226c4f3a-3db3-4244-adc3-bc224b90d8fe',
628
+ doctor: 'a8a8c96e-1350-11df-a1f1-0026b9348838',
629
+ yes: 'a899b35c-1350-11df-a1f1-0026b9348838',
630
+ no: 'a899b42e-1350-11df-a1f1-0026b9348838',
631
+ other: 'a8aaf3e2-1350-11df-a1f1-0026b9348838',
632
+ plannedServiceConcept: 'c0ffee00-e1e2-4a3b-9c0d-e1e2e3e4e5e6',
633
+ } as const;
634
+
635
+ export const PREAUTH_INTERVENTION_TYPE = {
636
+ surgical: '63c079d9-87fb-4bea-b860-863bff0e29c5',
637
+ renal: '597896cd-2841-42e9-8fb0-4292f82ac7b6',
638
+ normal: 'a8a09ac8-1350-11df-a1f1-0026b9348838',
639
+ imaging: '5771e408-a5e5-402b-9f29-b76106dfc71a',
640
+ optical: 'a8a06788-1350-11df-a1f1-0026b9348838',
641
+ oncology: '073ea366-834b-49bd-b4db-ce4e6c61bbc3',
642
+ } as const;
643
+
644
+ const FREQUENCY_CONCEPT_TO_HIE: Record<string, string> = {
645
+ // Confirmed from live PREAUTHORIZATION encounter (ONCE A WEEK)
646
+ '5dcfe297-2ef7-4f1c-97e3-a519c18fcc84': 'ONCE_A_WEEK',
647
+ '690b2ab2-4cbc-4df4-be19-64b8a93981ab': 'ONCE_EVERY_2_WEEKS',
648
+ '72ec1de0-4bf0-4c40-9329-b8f574a64132': 'ONCE_EVERY_3_WEEKS',
649
+ 'a899d7f6-1350-11df-a1f1-0026b9348838': 'ONCE_A_MONTH',
650
+ };
651
+
652
+ function mapFrequencyFromObs(obs: Record<string, unknown> | undefined): string {
653
+ if (!obs) return '';
654
+ const uuid = codedUuid(obs.value);
655
+ if (uuid && FREQUENCY_CONCEPT_TO_HIE[uuid]) {
656
+ return FREQUENCY_CONCEPT_TO_HIE[uuid];
657
+ }
658
+ // Fallback when form schema used placeholder UUIDs but display names are correct
659
+ const display = codedDisplay(obs.value).toUpperCase().replace(/\s+/g, ' ');
660
+ if (!display) return '';
661
+ if (display.includes('TWICE') && display.includes('WEEK')) return 'TWICE_A_WEEK';
662
+ if (
663
+ (display.includes('ONCE') || display.includes('ONE TIME') || display.includes('EVERY')) &&
664
+ display.includes('WEEK') &&
665
+ !display.includes('2') &&
666
+ !display.includes('3')
667
+ ) {
668
+ return 'ONCE_A_WEEK';
669
+ }
670
+ if (display.includes('2 WEEK') || display.includes('EVERY 2')) return 'ONCE_EVERY_2_WEEKS';
671
+ if (display.includes('3 WEEK') || display.includes('EVERY 3')) return 'ONCE_EVERY_3_WEEKS';
672
+ if (display.includes('MONTH')) return 'ONCE_A_MONTH';
673
+ return '';
674
+ }
675
+
676
+ const ANAESTHESIA_CONCEPT_TO_HIE: Record<string, string> = {
677
+ '7a69a31a-d88f-4ebd-a00b-cb5b4581de00': 'GENERAL',
678
+ '074225d4-b1be-56e9-93f6-255ebf106df3': 'LOCAL',
679
+ '3fa5c3a8-41e5-493a-9ab7-7177fc6f8c82': 'SEDATION',
680
+ 'f45ac884-e73e-4b02-9d8b-49c4e3ce5a15': 'SPINAL',
681
+ };
682
+
683
+ /** In-memory cache for concept UUID → display (complaint answers, etc.). */
684
+ const conceptDisplayCache = new Map<string, string>();
685
+
686
+ async function fetchConceptDisplay(conceptUuid: string): Promise<string> {
687
+ const uuid = (conceptUuid ?? '').trim();
688
+ if (!uuid) return '';
689
+ if (conceptDisplayCache.has(uuid)) {
690
+ return conceptDisplayCache.get(uuid) ?? '';
691
+ }
692
+ try {
693
+ const res = await openmrsFetch(
694
+ `${restBaseUrl}/concept/${uuid}?v=custom:(uuid,display,name:(display))`,
695
+ );
696
+ const data = res?.data as { display?: string; name?: { display?: string } } | undefined;
697
+ const display = String(data?.display ?? data?.name?.display ?? '').trim();
698
+ conceptDisplayCache.set(uuid, display);
699
+ return display;
700
+ } catch {
701
+ conceptDisplayCache.set(uuid, '');
702
+ return '';
703
+ }
704
+ }
705
+
706
+ /**
707
+ * Resolve presenting-complaint labels from coded obs.
708
+ * Prefer display already on the obs value; otherwise look up the concept in OpenMRS.
709
+ */
710
+ async function resolveChiefComplaintFromObs(obsList: Record<string, unknown>[]): Promise<string> {
711
+ const C = PREAUTH_FORM_CONCEPTS;
712
+ const labels: string[] = [];
713
+ const missingUuids: string[] = [];
714
+
715
+ for (const obs of obsList) {
716
+ if (conceptUuidOf(obs) !== C.complaint) continue;
717
+ const uuid = codedUuid(obs.value);
718
+ const fromObs = codedDisplay(obs.value) || obsTextValue(obs);
719
+ if (fromObs) {
720
+ labels.push(fromObs);
721
+ } else if (uuid) {
722
+ missingUuids.push(uuid);
723
+ }
724
+ }
725
+
726
+ if (missingUuids.length) {
727
+ const unique = [...new Set(missingUuids)];
728
+ const fetched = await Promise.all(unique.map((u) => fetchConceptDisplay(u)));
729
+ const byUuid = new Map(unique.map((u, i) => [u, fetched[i]]));
730
+ for (const uuid of missingUuids) {
731
+ const label = byUuid.get(uuid) ?? '';
732
+ if (label) labels.push(label);
733
+ }
734
+ }
735
+
736
+ for (const obs of obsList) {
737
+ if (conceptUuidOf(obs) !== C.otherComplaint) continue;
738
+ const other = obsTextValue(obs);
739
+ if (other) labels.push(other);
740
+ }
741
+
742
+ return [...new Set(labels)].join('; ');
743
+ }
744
+
745
+ export type PreauthFormFieldKey =
746
+ | 'clinicalIndications'
747
+ | 'startDate'
748
+ | 'expectedServiceStartDate'
749
+ | 'sessionsRequired'
750
+ | 'frequency'
751
+ | 'chiefComplaint'
752
+ | 'hpi'
753
+ | 'physicalExam'
754
+ | 'investigations'
755
+ | 'anaesthesia'
756
+ | 'surgeryDate'
757
+ | 'relatedToEmployment'
758
+ | 'relatedToAccident'
759
+ | 'isCoInsured'
760
+ | 'coInsuranceDetails';
761
+
762
+ export type PreauthFormValues = {
763
+ clinicalIndications: string;
764
+ startDate: string;
765
+ /** Elective expected service start — same obs concept as startDate on the POC form. */
766
+ expectedServiceStartDate: string;
767
+ sessionsRequired: string;
768
+ frequency: string;
769
+ chiefComplaint: string;
770
+ hpi: string;
771
+ physicalExam: string;
772
+ investigations: string;
773
+ anaesthesia: string;
774
+ surgeryDate: string;
775
+ relatedToEmployment: boolean | null;
776
+ relatedToAccident: boolean | null;
777
+ isCoInsured: boolean | null;
778
+ coInsuranceDetails: string;
779
+ /** Keys that had a real value from the form / obs. */
780
+ found: Set<PreauthFormFieldKey>;
781
+ source: 'encounter' | 'obs' | 'none';
782
+ };
783
+
784
+ function emptyPreauthFormValues(source: PreauthFormValues['source'] = 'none'): PreauthFormValues {
785
+ return {
786
+ clinicalIndications: '',
787
+ startDate: '',
788
+ expectedServiceStartDate: '',
789
+ sessionsRequired: '',
790
+ frequency: '',
791
+ chiefComplaint: '',
792
+ hpi: '',
793
+ physicalExam: '',
794
+ investigations: '',
795
+ anaesthesia: '',
796
+ surgeryDate: '',
797
+ relatedToEmployment: null,
798
+ relatedToAccident: null,
799
+ isCoInsured: null,
800
+ coInsuranceDetails: '',
801
+ found: new Set(),
802
+ source,
803
+ };
804
+ }
805
+
806
+ function conceptUuidOf(obs: Record<string, unknown>): string {
807
+ const c = obs.concept;
808
+ if (typeof c === 'string') return c;
809
+ if (c && typeof c === 'object' && 'uuid' in c) return String((c as { uuid: string }).uuid ?? '');
810
+ return '';
811
+ }
812
+
813
+ function codedUuid(value: unknown): string {
814
+ if (!value) return '';
815
+ if (typeof value === 'string') return value;
816
+ if (typeof value === 'object' && value !== null && 'uuid' in value) {
817
+ return String((value as { uuid: string }).uuid ?? '');
818
+ }
819
+ return '';
820
+ }
821
+
822
+ function codedDisplay(value: unknown): string {
823
+ if (!value || typeof value !== 'object') return '';
824
+ const v = value as { display?: string; name?: { display?: string } };
825
+ return String(v.display ?? v.name?.display ?? '').trim();
826
+ }
827
+
828
+ function obsTextValue(obs: Record<string, unknown> | null | undefined): string {
829
+ if (!obs) return '';
830
+ if (typeof obs.valueText === 'string' && obs.valueText.trim()) {
831
+ return obs.valueText.trim();
832
+ }
833
+ const value = obs.value;
834
+ if (typeof value === 'string' && value.trim()) {
835
+ return value.trim();
836
+ }
837
+ if (typeof value === 'number' && Number.isFinite(value)) {
838
+ return String(value);
839
+ }
840
+ return '';
841
+ }
842
+
843
+ function obsNumericValue(obs: Record<string, unknown> | null | undefined): string {
844
+ if (!obs) return '';
845
+ const value = obs.value;
846
+ if (typeof value === 'number' && Number.isFinite(value)) return String(value);
847
+ if (typeof value === 'string' && value.trim() && !Number.isNaN(Number(value))) return value.trim();
848
+ return obsTextValue(obs);
849
+ }
850
+
851
+ function obsDateIso(obs: Record<string, unknown> | null | undefined): string {
852
+ if (!obs) return '';
853
+ const raw =
854
+ (typeof obs.valueDate === 'string' && obs.valueDate) ||
855
+ (typeof obs.valueDatetime === 'string' && obs.valueDatetime) ||
856
+ (typeof obs.value === 'string' && obs.value) ||
857
+ '';
858
+ const d = dayjs(raw);
859
+ return d.isValid() ? d.format('YYYY-MM-DDTHH:mm:ssZ') : '';
860
+ }
861
+
862
+ function obsYesNo(obs: Record<string, unknown> | null | undefined): boolean | null {
863
+ if (!obs) return null;
864
+ const uuid = codedUuid(obs.value);
865
+ if (uuid === PREAUTH_FORM_CONCEPTS.yes) return true;
866
+ if (uuid === PREAUTH_FORM_CONCEPTS.no) return false;
867
+ return null;
868
+ }
869
+
870
+ function flattenObs(obsList: unknown[]): Record<string, unknown>[] {
871
+ const out: Record<string, unknown>[] = [];
872
+ for (const item of obsList ?? []) {
873
+ if (!item || typeof item !== 'object') continue;
874
+ const obs = item as Record<string, unknown>;
875
+ out.push(obs);
876
+ const groupMembers = obs.groupMembers ?? obs.group_members;
877
+ if (Array.isArray(groupMembers)) {
878
+ out.push(...flattenObs(groupMembers));
879
+ }
880
+ }
881
+ return out;
882
+ }
883
+
884
+ function latestObsByConcept(obsList: Record<string, unknown>[]): Map<string, Record<string, unknown>> {
885
+ const map = new Map<string, Record<string, unknown>>();
886
+ const sorted = [...obsList].sort((a, b) => {
887
+ const ta = dayjs(String(a.obsDatetime ?? '')).valueOf() || 0;
888
+ const tb = dayjs(String(b.obsDatetime ?? '')).valueOf() || 0;
889
+ return tb - ta;
890
+ });
891
+ for (const obs of sorted) {
892
+ const cu = conceptUuidOf(obs);
893
+ if (cu && !map.has(cu)) {
894
+ map.set(cu, obs);
895
+ }
896
+ }
897
+ return map;
898
+ }
899
+
900
+ function markFound(values: PreauthFormValues, key: PreauthFormFieldKey, present: boolean) {
901
+ if (present) values.found.add(key);
902
+ }
903
+
904
+ async function mapObsToPreauthFormValues(
905
+ obsList: Record<string, unknown>[],
906
+ source: PreauthFormValues['source'],
907
+ surgeryDateFromEncounter?: string,
908
+ ): Promise<PreauthFormValues> {
909
+ const values = emptyPreauthFormValues(source);
910
+ const byConcept = latestObsByConcept(obsList);
911
+ const C = PREAUTH_FORM_CONCEPTS;
912
+
913
+ const clinical = obsTextValue(byConcept.get(C.clinicalIndication));
914
+ values.clinicalIndications = clinical;
915
+ markFound(values, 'clinicalIndications', Boolean(clinical));
916
+
917
+ const start = obsDateIso(byConcept.get(C.startDate));
918
+ values.startDate = start;
919
+ markFound(values, 'startDate', Boolean(start));
920
+ // Elective expected service start is stored on the same POC form date concept.
921
+ values.expectedServiceStartDate = start;
922
+ markFound(values, 'expectedServiceStartDate', Boolean(start));
923
+
924
+ const sessions = obsNumericValue(byConcept.get(C.sessionNumber));
925
+ values.sessionsRequired = sessions;
926
+ // Keep "0" as a valid found value (Boolean("0") is true; avoid treating empty only).
927
+ markFound(values, 'sessionsRequired', sessions !== '');
928
+
929
+ const freqObs = byConcept.get(C.frequencyOfSessions);
930
+ const frequency = mapFrequencyFromObs(freqObs);
931
+ values.frequency = frequency;
932
+ markFound(values, 'frequency', Boolean(frequency));
933
+
934
+ values.chiefComplaint = await resolveChiefComplaintFromObs(obsList);
935
+ markFound(values, 'chiefComplaint', Boolean(values.chiefComplaint));
936
+
937
+ const hpi = obsTextValue(byConcept.get(C.hpi));
938
+ values.hpi = hpi;
939
+ markFound(values, 'hpi', Boolean(hpi));
940
+
941
+ const exam = obsTextValue(byConcept.get(C.generalExam));
942
+ values.physicalExam = exam;
943
+ markFound(values, 'physicalExam', Boolean(exam));
944
+
945
+ const inv = obsTextValue(byConcept.get(C.investigation));
946
+ values.investigations = inv;
947
+ markFound(values, 'investigations', Boolean(inv));
948
+
949
+ const anaObs = byConcept.get(C.anaesthesia);
950
+ const anaUuid = codedUuid(anaObs?.value);
951
+ const anaesthesia = ANAESTHESIA_CONCEPT_TO_HIE[anaUuid] ?? '';
952
+ values.anaesthesia = anaesthesia;
953
+ markFound(values, 'anaesthesia', Boolean(anaesthesia));
954
+
955
+ if (surgeryDateFromEncounter) {
956
+ values.surgeryDate = surgeryDateFromEncounter;
957
+ markFound(values, 'surgeryDate', true);
958
+ }
959
+
960
+ const emp = obsYesNo(byConcept.get(C.employmentRelated));
961
+ values.relatedToEmployment = emp;
962
+ markFound(values, 'relatedToEmployment', emp !== null);
963
+
964
+ const acc = obsYesNo(byConcept.get(C.accidentRelated));
965
+ values.relatedToAccident = acc;
966
+ markFound(values, 'relatedToAccident', acc !== null);
967
+
968
+ const co = obsYesNo(byConcept.get(C.coInsured));
969
+ values.isCoInsured = co;
970
+ markFound(values, 'isCoInsured', co !== null);
971
+
972
+ const coDetails = obsTextValue(byConcept.get(C.coInsuredDetails));
973
+ values.coInsuranceDetails = coDetails;
974
+ markFound(values, 'coInsuranceDetails', Boolean(coDetails));
975
+
976
+ return values;
977
+ }
978
+
979
+ async function fetchLatestObsForConcept(
980
+ patientUuid: string,
981
+ conceptUuid: string,
982
+ ): Promise<Record<string, unknown>[]> {
983
+ try {
984
+ const qs = new URLSearchParams({
985
+ patient: patientUuid,
986
+ concept: conceptUuid,
987
+ v: 'custom:(uuid,obsDatetime,concept:(uuid),value,valueText,valueDate,valueDatetime,groupMembers:(uuid,obsDatetime,concept:(uuid),value,valueText))',
988
+ limit: '50',
989
+ });
990
+ const res = await openmrsFetch(`${restBaseUrl}/obs?${qs.toString()}`);
991
+ return (res?.data?.results ?? []) as Record<string, unknown>[];
992
+ } catch {
993
+ return [];
994
+ }
995
+ }
996
+
997
+ async function fetchLatestEncounterByType(
998
+ patientUuid: string,
999
+ encounterTypeUuid: string,
1000
+ opts?: { fromDatetime?: string; locationUuid?: string },
1001
+ ): Promise<Record<string, unknown> | null> {
1002
+ try {
1003
+ const qs = new URLSearchParams({
1004
+ patient: patientUuid,
1005
+ encounterType: encounterTypeUuid,
1006
+ v: 'full',
1007
+ limit: '20',
1008
+ });
1009
+ if (opts?.fromDatetime) {
1010
+ qs.set('fromdate', opts.fromDatetime);
1011
+ }
1012
+ const res = await openmrsFetch(`${restBaseUrl}/encounter?${qs.toString()}`);
1013
+ let results = (res?.data?.results ?? []) as Record<string, unknown>[];
1014
+ if (opts?.locationUuid) {
1015
+ const loc = opts.locationUuid.trim();
1016
+ const atLoc = results.filter((e) => {
1017
+ const l = e.location as { uuid?: string } | undefined;
1018
+ return String(l?.uuid ?? '') === loc;
1019
+ });
1020
+ if (atLoc.length) results = atLoc;
1021
+ }
1022
+ if (!results.length) return null;
1023
+ const sorted = [...results].sort((a, b) => {
1024
+ const ta = dayjs(String(a.encounterDatetime ?? '')).valueOf() || 0;
1025
+ const tb = dayjs(String(b.encounterDatetime ?? '')).valueOf() || 0;
1026
+ return tb - ta;
1027
+ });
1028
+ let encounter = sorted[0] ?? null;
1029
+ if (!encounter) return null;
1030
+
1031
+ const obs = encounter.obs;
1032
+ const diagnoses = encounter.diagnoses;
1033
+ const providers = encounter.encounterProviders;
1034
+ const needsReload =
1035
+ !Array.isArray(obs) ||
1036
+ obs.length === 0 ||
1037
+ !Array.isArray(diagnoses) ||
1038
+ !Array.isArray(providers);
1039
+ if (needsReload) {
1040
+ const id = String(encounter.uuid ?? '');
1041
+ if (id) {
1042
+ try {
1043
+ const full = await openmrsFetch(
1044
+ `${restBaseUrl}/encounter/${id}?v=custom:(uuid,encounterDatetime,location:(uuid),encounterProviders:(display,provider:(uuid,display,attributes:(value,voided,attributeType:(uuid)))),diagnoses:(uuid,display,rank,certainty,diagnosis:(coded:(uuid,display))),obs:(uuid,voided,concept:(uuid),value,valueText,valueNumeric,groupMembers:(uuid,concept:(uuid),value,valueText)))`,
1045
+ );
1046
+ if (full?.data && typeof full.data === 'object') {
1047
+ encounter = full.data as Record<string, unknown>;
1048
+ }
1049
+ } catch {
1050
+ // keep list representation
1051
+ }
1052
+ }
1053
+ }
1054
+ return encounter;
1055
+ } catch {
1056
+ return null;
1057
+ }
1058
+ }
1059
+
1060
+ async function fetchLatestPreauthEncounter(patientUuid: string): Promise<Record<string, unknown> | null> {
1061
+ return fetchLatestEncounterByType(patientUuid, PREAUTH_ENCOUNTER_TYPE_UUID);
1062
+ }
1063
+
1064
+ /**
1065
+ * Prefill values from POC Pre-authorization Form:
1066
+ * 1) specific encounter when encounterUuid is provided (elective hold Raise)
1067
+ * 2) else latest PREAUTHORIZATION encounter obs
1068
+ * 3) else latest obs per concept
1069
+ */
1070
+ export async function fetchPreauthFormValues(
1071
+ patientUuid: string,
1072
+ encounterUuid?: string,
1073
+ opts?: { allowConceptFallback?: boolean },
1074
+ ): Promise<PreauthFormValues> {
1075
+ const uuid = (patientUuid ?? '').trim();
1076
+ if (!uuid) return emptyPreauthFormValues('none');
1077
+
1078
+ const encounterId = (encounterUuid ?? '').trim();
1079
+ // Elective hold (explicit encounter, no fallback): never pull unrelated latest obs.
1080
+ // Normal Raise / clinical: allow per-concept fallback when the encounter has no form obs.
1081
+ const allowConceptFallback = opts?.allowConceptFallback === true || !encounterId;
1082
+ let encounter: Record<string, unknown> | null = null;
1083
+ if (encounterId) {
1084
+ try {
1085
+ const full = await openmrsFetch(`${restBaseUrl}/encounter/${encounterId}?v=full`);
1086
+ if (full?.data && typeof full.data === 'object') {
1087
+ encounter = full.data as Record<string, unknown>;
1088
+ }
1089
+ } catch {
1090
+ encounter = null;
1091
+ }
1092
+ }
1093
+ if (!encounter) {
1094
+ encounter = await fetchLatestPreauthEncounter(uuid);
1095
+ }
1096
+ if (encounter) {
1097
+ const obs = flattenObs(Array.isArray(encounter.obs) ? encounter.obs : []);
1098
+ const surgeryRaw = String(encounter.encounterDatetime ?? '');
1099
+ const surgeryDate = dayjs(surgeryRaw).isValid()
1100
+ ? dayjs(surgeryRaw).format('YYYY-MM-DDTHH:mm:ssZ')
1101
+ : '';
1102
+ const fromEncounter = await mapObsToPreauthFormValues(obs, 'encounter', surgeryDate);
1103
+ if (fromEncounter.found.size > 0 || !allowConceptFallback) {
1104
+ return fromEncounter;
1105
+ }
1106
+ // Encounter present but no mappable obs — fall through to per-concept latest
1107
+ }
1108
+
1109
+ const conceptList = [
1110
+ PREAUTH_FORM_CONCEPTS.clinicalIndication,
1111
+ PREAUTH_FORM_CONCEPTS.startDate,
1112
+ PREAUTH_FORM_CONCEPTS.sessionNumber,
1113
+ PREAUTH_FORM_CONCEPTS.frequencyOfSessions,
1114
+ PREAUTH_FORM_CONCEPTS.complaintGroup,
1115
+ PREAUTH_FORM_CONCEPTS.complaint,
1116
+ PREAUTH_FORM_CONCEPTS.otherComplaint,
1117
+ PREAUTH_FORM_CONCEPTS.hpi,
1118
+ PREAUTH_FORM_CONCEPTS.generalExam,
1119
+ PREAUTH_FORM_CONCEPTS.investigation,
1120
+ PREAUTH_FORM_CONCEPTS.anaesthesia,
1121
+ PREAUTH_FORM_CONCEPTS.employmentRelated,
1122
+ PREAUTH_FORM_CONCEPTS.accidentRelated,
1123
+ PREAUTH_FORM_CONCEPTS.coInsured,
1124
+ PREAUTH_FORM_CONCEPTS.coInsuredDetails,
1125
+ ];
1126
+
1127
+ const batches = await Promise.all(conceptList.map((c) => fetchLatestObsForConcept(uuid, c)));
1128
+ const allObs = flattenObs(batches.flat());
1129
+ if (!allObs.length) return emptyPreauthFormValues(encounter ? 'encounter' : 'none');
1130
+ return mapObsToPreauthFormValues(allObs, 'obs');
1131
+ }
1132
+
1133
+ /**
1134
+ * Latest OpenMRS obs for the clinical-indications concept for a patient.
1135
+ * Soft-fails to '' if missing or the request errors.
1136
+ */
1137
+ export async function fetchLatestClinicalIndicationsObs(patientUuid: string): Promise<string> {
1138
+ const values = await fetchPreauthFormValues(patientUuid);
1139
+ return values.clinicalIndications;
1140
+ }
1141
+
1142
+ export type EncounterPrefillDiagnosis = {
1143
+ key: string;
1144
+ conceptUuid: string;
1145
+ display: string;
1146
+ icd11Code: string;
1147
+ rank: number;
1148
+ };
1149
+
1150
+ export type EncounterPrefillModel = {
1151
+ encounterUuid: string;
1152
+ source: 'preauth' | 'clinical' | 'explicit';
1153
+ formValues: PreauthFormValues;
1154
+ diagnoses: EncounterPrefillDiagnosis[];
1155
+ providerNationalId: string;
1156
+ providerDisplay: string;
1157
+ providerUuid: string;
1158
+ };
1159
+
1160
+ const ENCOUNTER_PREFILL_REP =
1161
+ 'custom:(uuid,encounterDatetime,location:(uuid),encounterProviders:(display,provider:(uuid,display,attributes:(value,voided,attributeType:(uuid)))),diagnoses:(uuid,display,rank,certainty,diagnosis:(coded:(uuid,display))),obs:(uuid,voided,concept:(uuid),value,valueText,valueNumeric,groupMembers:(uuid,concept:(uuid),value,valueText)))';
1162
+
1163
+ const CONCEPT_ICD_REP =
1164
+ 'custom:(uuid,display,mappings:(display,conceptReferenceTerm:(uuid,code,name,conceptSource:(uuid,name,hl7Code))))';
1165
+
1166
+ function obsNumericOrText(obs: Record<string, unknown> | undefined): string {
1167
+ if (!obs) return '';
1168
+ const n = obs.valueNumeric;
1169
+ if (typeof n === 'number' && Number.isFinite(n)) return String(n);
1170
+ const value = obs.value;
1171
+ if (typeof value === 'number' && Number.isFinite(value)) return String(value);
1172
+ if (typeof value === 'string' && value.trim()) return value.trim();
1173
+ return obsTextValue(obs);
1174
+ }
1175
+
1176
+ function providerFromEncounter(enc: Record<string, unknown>): {
1177
+ providerNationalId: string;
1178
+ providerDisplay: string;
1179
+ providerUuid: string;
1180
+ } {
1181
+ const providers = (Array.isArray(enc.encounterProviders) ? enc.encounterProviders : []) as Array<{
1182
+ display?: string;
1183
+ provider?: {
1184
+ uuid?: string;
1185
+ display?: string;
1186
+ attributes?: Array<{ value?: string; voided?: boolean; attributeType?: { uuid?: string } }>;
1187
+ };
1188
+ }>;
1189
+ const primary = providers[0];
1190
+ const provider = primary?.provider;
1191
+ const providerDisplay =
1192
+ String(provider?.display ?? '').trim() ||
1193
+ String(primary?.display ?? '')
1194
+ .split(' - ')[0]
1195
+ ?.trim() ||
1196
+ '';
1197
+ const providerUuid = String(provider?.uuid ?? '').trim();
1198
+ const providerNationalId = extractProviderNationalId(provider?.attributes) ?? '';
1199
+ return { providerNationalId, providerDisplay, providerUuid };
1200
+ }
1201
+
1202
+ async function resolveDoctorObsToProvider(
1203
+ obsList: Record<string, unknown>[],
1204
+ ): Promise<{ providerNationalId: string; providerDisplay: string; providerUuid: string } | null> {
1205
+ const doctorObs = obsList.find((o) => !o.voided && conceptUuidOf(o) === PREAUTH_FORM_CONCEPTS.doctor);
1206
+ if (!doctorObs) return null;
1207
+
1208
+ const value = doctorObs.value;
1209
+ let personUuid = '';
1210
+ let display = '';
1211
+ if (value && typeof value === 'object') {
1212
+ const v = value as { uuid?: string; display?: string; person?: { uuid?: string; display?: string } };
1213
+ personUuid = String(v.person?.uuid ?? v.uuid ?? '').trim();
1214
+ display = String(v.display ?? v.person?.display ?? '').trim();
1215
+ } else if (typeof value === 'string') {
1216
+ const t = value.trim();
1217
+ if (/^[0-9a-f-]{36}$/i.test(t)) personUuid = t;
1218
+ else display = t;
1219
+ }
1220
+ const textNatId = obsTextValue(doctorObs);
1221
+ if (/^\d{5,}$/.test(textNatId) && !personUuid) {
1222
+ return { providerNationalId: textNatId, providerDisplay: display, providerUuid: '' };
1223
+ }
1224
+
1225
+ try {
1226
+ if (personUuid) {
1227
+ const res = await openmrsFetch(
1228
+ `${restBaseUrl}/provider?person=${encodeURIComponent(personUuid)}&v=custom:(uuid,display,identifier,person:(uuid,display),attributes:(uuid,value,voided,attributeType:(uuid)))`,
1229
+ );
1230
+ const p = ((res?.data?.results ?? []) as Array<OpenMrsProviderHit & { attributes?: any[] }>)[0];
1231
+ if (p?.uuid) {
1232
+ return {
1233
+ providerUuid: p.uuid,
1234
+ providerDisplay: p.display || display,
1235
+ providerNationalId: extractProviderNationalId(p.attributes) ?? '',
1236
+ };
1237
+ }
1238
+ }
1239
+ if (display.length >= 2) {
1240
+ const hits = await searchOpenMrsProviders(display);
1241
+ const hit = hits[0];
1242
+ if (hit) {
1243
+ return {
1244
+ providerUuid: hit.uuid,
1245
+ providerDisplay: hit.display,
1246
+ providerNationalId: hit.nationalId ?? '',
1247
+ };
1248
+ }
1249
+ }
1250
+ } catch {
1251
+ // soft-fail
1252
+ }
1253
+ return display || textNatId
1254
+ ? { providerNationalId: /^\d{5,}$/.test(textNatId) ? textNatId : '', providerDisplay: display, providerUuid: '' }
1255
+ : null;
1256
+ }
1257
+
1258
+ async function enrichDiagnosisIcd11(dx: EncounterPrefillDiagnosis): Promise<EncounterPrefillDiagnosis> {
1259
+ if (dx.icd11Code || !dx.conceptUuid) return dx;
1260
+ try {
1261
+ const res = await openmrsFetch(
1262
+ `${restBaseUrl}/concept/${dx.conceptUuid}?v=${encodeURIComponent(CONCEPT_ICD_REP)}`,
1263
+ );
1264
+ const c = res?.data as { uuid?: string; display?: string; mappings?: ConceptMappingLike[] } | undefined;
1265
+ if (!c) return dx;
1266
+ const icd11Code = extractIcd11CodeFromConcept(c);
1267
+ return {
1268
+ ...dx,
1269
+ display: dx.display || String(c.display ?? dx.conceptUuid),
1270
+ icd11Code: icd11Code || dx.icd11Code,
1271
+ };
1272
+ } catch {
1273
+ return dx;
1274
+ }
1275
+ }
1276
+
1277
+ function mapEncounterDiagnoses(enc: Record<string, unknown>): EncounterPrefillDiagnosis[] {
1278
+ const diagnoses: EncounterPrefillDiagnosis[] = [];
1279
+ const dxList = (Array.isArray(enc.diagnoses) ? enc.diagnoses : []) as Array<Record<string, unknown>>;
1280
+ for (const dx of dxList) {
1281
+ const diagnosis = (dx.diagnosis ?? {}) as Record<string, unknown>;
1282
+ const coded = diagnosis.coded as { uuid?: string; display?: string } | string | undefined;
1283
+ const conceptUuidDx =
1284
+ typeof coded === 'object' ? String(coded?.uuid ?? '').trim() : String(coded ?? '').trim();
1285
+ const display =
1286
+ (typeof coded === 'object' ? String(coded?.display ?? '').trim() : '') ||
1287
+ String(dx.display ?? '').trim() ||
1288
+ conceptUuidDx;
1289
+ if (!conceptUuidDx) continue;
1290
+ diagnoses.push({
1291
+ key: `enc-dx-${conceptUuidDx}`,
1292
+ conceptUuid: conceptUuidDx,
1293
+ display,
1294
+ icd11Code: '',
1295
+ rank: typeof dx.rank === 'number' ? dx.rank : Number(dx.rank) || 1,
1296
+ });
1297
+ }
1298
+ diagnoses.sort((a, b) => a.rank - b.rank);
1299
+ return diagnoses;
1300
+ }
1301
+
1302
+ function prefillHasUsableData(model: {
1303
+ formValues: PreauthFormValues;
1304
+ diagnoses: EncounterPrefillDiagnosis[];
1305
+ providerNationalId: string;
1306
+ }): boolean {
1307
+ return (
1308
+ model.diagnoses.length > 0 ||
1309
+ model.formValues.found.size > 0 ||
1310
+ Boolean(model.providerNationalId.trim()) ||
1311
+ Boolean(model.formValues.clinicalIndications.trim())
1312
+ );
1313
+ }
1314
+
1315
+ /**
1316
+ * Load Raise prefill from a single encounter (elective-shaped): diagnoses[], formValues, provider.
1317
+ */
1318
+ export async function loadEncounterPrefill(
1319
+ patientUuid: string,
1320
+ encounterUuid: string,
1321
+ source: EncounterPrefillModel['source'] = 'explicit',
1322
+ ): Promise<EncounterPrefillModel | null> {
1323
+ const encUuid = (encounterUuid ?? '').trim();
1324
+ const patient = (patientUuid ?? '').trim();
1325
+ if (!encUuid || !patient) return null;
1326
+
1327
+ let enc: Record<string, unknown> | null = null;
1328
+ try {
1329
+ const res = await openmrsFetch(`${restBaseUrl}/encounter/${encUuid}?v=${encodeURIComponent(ENCOUNTER_PREFILL_REP)}`);
1330
+ if (res?.data && typeof res.data === 'object') {
1331
+ enc = res.data as Record<string, unknown>;
1332
+ }
1333
+ } catch {
1334
+ enc = null;
1335
+ }
1336
+ if (!enc?.uuid) {
1337
+ try {
1338
+ const full = await openmrsFetch(`${restBaseUrl}/encounter/${encUuid}?v=full`);
1339
+ if (full?.data && typeof full.data === 'object') {
1340
+ enc = full.data as Record<string, unknown>;
1341
+ }
1342
+ } catch {
1343
+ return null;
1344
+ }
1345
+ }
1346
+ if (!enc?.uuid) return null;
1347
+
1348
+ const formValues = await fetchPreauthFormValues(patient, encUuid, {
1349
+ // Explicit elective hold: only that encounter. Otherwise allow latest obs per concept
1350
+ // when the resolved Preauth/Clinical encounter has no form fields (common for Clinical).
1351
+ allowConceptFallback: source !== 'explicit',
1352
+ });
1353
+ let diagnoses = mapEncounterDiagnoses(enc);
1354
+ diagnoses = await Promise.all(diagnoses.map(enrichDiagnosisIcd11));
1355
+
1356
+ let provider = providerFromEncounter(enc);
1357
+ if (!provider.providerNationalId) {
1358
+ const obs = flattenObs(Array.isArray(enc.obs) ? enc.obs : []);
1359
+ const fromDoctor = await resolveDoctorObsToProvider(obs);
1360
+ if (fromDoctor) {
1361
+ provider = {
1362
+ providerNationalId: fromDoctor.providerNationalId || provider.providerNationalId,
1363
+ providerDisplay: fromDoctor.providerDisplay || provider.providerDisplay,
1364
+ providerUuid: fromDoctor.providerUuid || provider.providerUuid,
1365
+ };
1366
+ }
1367
+ }
1368
+
1369
+ return {
1370
+ encounterUuid: String(enc.uuid),
1371
+ source,
1372
+ formValues,
1373
+ diagnoses,
1374
+ providerNationalId: provider.providerNationalId,
1375
+ providerDisplay: provider.providerDisplay,
1376
+ providerUuid: provider.providerUuid,
1377
+ };
1378
+ }
1379
+
1380
+ /**
1381
+ * Resolve which encounter to use for Raise prefill, then load it.
1382
+ * - explicit encounterUuid → that encounter only (elective hold)
1383
+ * - else latest Preauth, else Clinical (prefer Preauth when specialtyNeedsForm)
1384
+ */
1385
+ export async function resolveAndLoadRaisePrefill(opts: {
1386
+ patientUuid: string;
1387
+ encounterUuid?: string;
1388
+ specialtyNeedsForm?: boolean;
1389
+ }): Promise<EncounterPrefillModel | null> {
1390
+ const patientUuid = (opts.patientUuid ?? '').trim();
1391
+ if (!patientUuid) return null;
1392
+
1393
+ const explicit = (opts.encounterUuid ?? '').trim();
1394
+ if (explicit) {
1395
+ return loadEncounterPrefill(patientUuid, explicit, 'explicit');
1396
+ }
1397
+
1398
+ const [preauthEnc, clinicalEnc] = await Promise.all([
1399
+ fetchLatestEncounterByType(patientUuid, PREAUTH_ENCOUNTER_TYPE_UUID),
1400
+ fetchLatestEncounterByType(patientUuid, CLINICAL_ENCOUNTER_TYPE_UUID),
1401
+ ]);
1402
+
1403
+ const tryLoad = async (
1404
+ enc: Record<string, unknown> | null,
1405
+ source: 'preauth' | 'clinical',
1406
+ ): Promise<EncounterPrefillModel | null> => {
1407
+ const id = String(enc?.uuid ?? '').trim();
1408
+ if (!id) return null;
1409
+ return loadEncounterPrefill(patientUuid, id, source);
1410
+ };
1411
+
1412
+ const preauthModel = await tryLoad(preauthEnc, 'preauth');
1413
+ if (preauthModel && (opts.specialtyNeedsForm || prefillHasUsableData(preauthModel))) {
1414
+ return preauthModel;
1415
+ }
1416
+
1417
+ const clinicalModel = await tryLoad(clinicalEnc, 'clinical');
1418
+ if (clinicalModel && prefillHasUsableData(clinicalModel)) {
1419
+ return clinicalModel;
1420
+ }
1421
+
1422
+ return preauthModel ?? clinicalModel;
1423
+ }
1424
+
1425
+ /**
1426
+ * Concatenate today's OPD Triage vital signs for surgical vital_signs.
1427
+ * Example: `Temp 36.8 C; Pulse 72; BP 120/80; RR 14; SpO2 98%`
1428
+ */
1429
+ export async function fetchTodaysTriageVitalsConcat(
1430
+ patientUuid: string,
1431
+ locationUuid?: string,
1432
+ ): Promise<string> {
1433
+ const uuid = (patientUuid ?? '').trim();
1434
+ if (!uuid) return '';
1435
+
1436
+ const fromDatetime = dayjs().startOf('day').toISOString();
1437
+ const enc = await fetchLatestEncounterByType(uuid, OPD_TRIAGE_ENCOUNTER_TYPE_UUID, {
1438
+ fromDatetime,
1439
+ locationUuid: (locationUuid ?? '').trim() || undefined,
1440
+ });
1441
+ if (!enc) return '';
1442
+
1443
+ const obsList = flattenObs(Array.isArray(enc.obs) ? enc.obs : []);
1444
+ const byConcept = latestObsByConcept(obsList);
1445
+ const C = TRIAGE_VITALS_CONCEPTS;
1446
+
1447
+ const temp = obsNumericOrText(byConcept.get(C.temperature));
1448
+ const pulse = obsNumericOrText(byConcept.get(C.pulse));
1449
+ const sys = obsNumericOrText(byConcept.get(C.systolicBp));
1450
+ const dia = obsNumericOrText(byConcept.get(C.diastolicBp));
1451
+ const rr = obsNumericOrText(byConcept.get(C.respiratoryRate));
1452
+ const spo2 = obsNumericOrText(byConcept.get(C.oxygenSaturation));
1453
+
1454
+ const parts: string[] = [];
1455
+ if (temp) parts.push(`Temp ${temp} C`);
1456
+ if (pulse) parts.push(`Pulse ${pulse}`);
1457
+ if (sys || dia) {
1458
+ parts.push(`BP ${sys || '—'}/${dia || '—'}`);
1459
+ }
1460
+ if (rr) parts.push(`RR ${rr}`);
1461
+ if (spo2) parts.push(`SpO2 ${spo2}%`);
1462
+ return parts.join('; ');
1463
+ }
1464
+
1465
+ export type PreauthBillableService = {
1466
+ uuid: string;
1467
+ name: string;
1468
+ shortName?: string;
1469
+ serviceStatus?: string;
1470
+ serviceType?: { uuid?: string; display?: string };
1471
+ servicePrices?: Array<{
1472
+ uuid?: string;
1473
+ name?: string;
1474
+ price?: number;
1475
+ paymentMode?: { uuid?: string; name?: string };
1476
+ }>;
1477
+ concept?: { uuid?: string };
1478
+ };
1479
+
1480
+ const PREAUTH_BILLABLE_PAGE_SIZE = 500; // OpenMRS REST absolute max on this server
1481
+
1482
+ /**
1483
+ * Fetches the facility's billable-service catalog in pages of ≤500
1484
+ * (server rejects higher limits with "absolute limit at 500").
1485
+ */
1486
+ async function fetchAllPreauthBillableServices(locationUuid?: string | null): Promise<PreauthBillableService[]> {
1487
+ const all: PreauthBillableService[] = [];
1488
+ let startIndex = 0;
1489
+
1490
+ for (;;) {
1491
+ const page = await fetchBillableServicePage<PreauthBillableService>({
1492
+ v: BILLABLE_SERVICE_PICKER_REPRESENTATION,
1493
+ locationUuid,
1494
+ limit: PREAUTH_BILLABLE_PAGE_SIZE,
1495
+ startIndex,
1496
+ });
1497
+ all.push(...page);
1498
+ if (page.length < PREAUTH_BILLABLE_PAGE_SIZE) {
1499
+ break;
1500
+ }
1501
+ startIndex += PREAUTH_BILLABLE_PAGE_SIZE;
1502
+ }
1503
+
1504
+ return all;
1505
+ }
1506
+
1507
+ /**
1508
+ * Billable-service catalog for the Raise preauth form only.
1509
+ * Kept separate from create-order `useBillableItems` so limit / filtering
1510
+ * changes here do not affect billing or switch-intervention workspaces.
1511
+ */
1512
+ export function usePreauthBillableServices() {
1513
+ const locationUuid = useBillableServiceLocationUuid();
1514
+ const { data, isLoading, error } = useSWR(['preauth-billable-services', locationUuid], () =>
1515
+ fetchAllPreauthBillableServices(locationUuid),
1516
+ );
1517
+ const [searchTerm, setSearchTerm] = useState('');
1518
+ const q = searchTerm.trim().toLowerCase();
1519
+ const lineItems = (data ?? []).filter((item) =>
1520
+ String(item?.name ?? '')
1521
+ .toLowerCase()
1522
+ .includes(q),
1523
+ );
1524
+
1525
+ return {
1526
+ lineItems,
1527
+ isLoading,
1528
+ error,
1529
+ searchTerm,
1530
+ setSearchTerm,
1531
+ };
1532
+ }
1533
+
1534
+ /** Reusable preauth status check — prefer these over calling getPreauthPreview directly. */
1535
+ export {
1536
+ checkPreauthStatus,
1537
+ usePreauthPreview,
1538
+ isPreauthFinalised,
1539
+ isPreauthTerminalFailure,
1540
+ isPreauthNeedsClarification,
1541
+ isPreauthResubmittable,
1542
+ interventionHasBlockingPreauth,
1543
+ interventionHasFailedPreauth,
1544
+ interventionAllowsPreauthResubmit,
1545
+ invalidatePreauthPreview,
1546
+ preauthPreviewSwrKey,
1547
+ type PreauthCheckKind,
1548
+ type PreauthCheckResult,
1549
+ } from '../../../../claims/claims.resource';