@ampath/esm-dha-workflow-app 4.0.0-next.35 → 4.0.0-next.355

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 (793) hide show
  1. package/README.md +19 -0
  2. package/dist/1149.js +1 -0
  3. package/dist/1149.js.map +1 -0
  4. package/dist/1171.js +1 -0
  5. package/dist/1171.js.map +1 -0
  6. package/dist/1197.js +1 -0
  7. package/dist/1239.js +1 -0
  8. package/dist/1239.js.map +1 -0
  9. package/dist/1277.js +1 -0
  10. package/dist/1277.js.map +1 -0
  11. package/dist/1363.js +1 -0
  12. package/dist/1363.js.map +1 -0
  13. package/dist/1551.js +1 -0
  14. package/dist/1551.js.map +1 -0
  15. package/dist/1556.js +1 -0
  16. package/dist/1556.js.map +1 -0
  17. package/dist/1560.js +1 -0
  18. package/dist/1560.js.map +1 -0
  19. package/dist/1925.js +1 -0
  20. package/dist/1925.js.map +1 -0
  21. package/dist/1927.js +1 -0
  22. package/dist/1927.js.map +1 -0
  23. package/dist/2054.js +1 -0
  24. package/dist/2054.js.map +1 -0
  25. package/dist/2093.js +1 -0
  26. package/dist/2093.js.map +1 -0
  27. package/dist/2177.js +2 -0
  28. package/dist/2177.js.map +1 -0
  29. package/dist/2230.js +1 -0
  30. package/dist/2230.js.map +1 -0
  31. package/dist/2493.js +1 -0
  32. package/dist/2493.js.map +1 -0
  33. package/dist/3041.js +1 -0
  34. package/dist/3041.js.map +1 -0
  35. package/dist/3099.js +1 -0
  36. package/dist/3101.js +1 -0
  37. package/dist/3101.js.map +1 -0
  38. package/dist/313.js +1 -0
  39. package/dist/313.js.map +1 -0
  40. package/dist/3184.js +2 -0
  41. package/dist/3184.js.map +1 -0
  42. package/dist/3202.js +1 -0
  43. package/dist/3202.js.map +1 -0
  44. package/dist/3222.js +1 -0
  45. package/dist/3222.js.map +1 -0
  46. package/dist/327.js +1 -0
  47. package/dist/327.js.map +1 -0
  48. package/dist/347.js +1 -0
  49. package/dist/347.js.map +1 -0
  50. package/dist/3595.js +1 -0
  51. package/dist/3595.js.map +1 -0
  52. package/dist/3928.js +1 -0
  53. package/dist/3928.js.map +1 -0
  54. package/dist/3939.js +1 -0
  55. package/dist/3939.js.map +1 -0
  56. package/dist/4003.js +1 -0
  57. package/dist/4003.js.map +1 -0
  58. package/dist/4055.js +1 -0
  59. package/dist/4205.js +1 -0
  60. package/dist/4205.js.map +1 -0
  61. package/dist/4225.js +1 -0
  62. package/dist/4225.js.map +1 -0
  63. package/dist/4231.js +1 -0
  64. package/dist/4231.js.map +1 -0
  65. package/dist/4300.js +1 -0
  66. package/dist/4335.js +1 -0
  67. package/dist/4353.js +1 -0
  68. package/dist/4353.js.map +1 -0
  69. package/dist/4431.js +1 -0
  70. package/dist/4431.js.map +1 -0
  71. package/dist/4454.js +1 -0
  72. package/dist/4454.js.map +1 -0
  73. package/dist/4457.js +2 -0
  74. package/dist/4457.js.LICENSE.txt +282 -0
  75. package/dist/4457.js.map +1 -0
  76. package/dist/4605.js +1 -0
  77. package/dist/4605.js.map +1 -0
  78. package/dist/4611.js +1 -0
  79. package/dist/4611.js.map +1 -0
  80. package/dist/4652.js +1 -0
  81. package/dist/4674.js +1 -0
  82. package/dist/4674.js.map +1 -0
  83. package/dist/4755.js +1 -0
  84. package/dist/4755.js.map +1 -0
  85. package/dist/4856.js +1 -0
  86. package/dist/4856.js.map +1 -0
  87. package/dist/4986.js +1 -0
  88. package/dist/4986.js.map +1 -0
  89. package/dist/5119.js +1 -0
  90. package/dist/5119.js.map +1 -0
  91. package/dist/5167.js +1 -0
  92. package/dist/5167.js.map +1 -0
  93. package/dist/5317.js +1 -0
  94. package/dist/5317.js.map +1 -0
  95. package/dist/5344.js +1 -0
  96. package/dist/5344.js.map +1 -0
  97. package/dist/5380.js +1 -0
  98. package/dist/5380.js.map +1 -0
  99. package/dist/5422.js +1 -0
  100. package/dist/5422.js.map +1 -0
  101. package/dist/5576.js +1 -0
  102. package/dist/5576.js.map +1 -0
  103. package/dist/5724.js +1 -0
  104. package/dist/5724.js.map +1 -0
  105. package/dist/5851.js +1 -0
  106. package/dist/5851.js.map +1 -0
  107. package/dist/5961.js +1 -0
  108. package/dist/5961.js.map +1 -0
  109. package/dist/6177.js +1 -0
  110. package/dist/6177.js.map +1 -0
  111. package/dist/6264.js +1 -0
  112. package/dist/6264.js.map +1 -0
  113. package/dist/6540.js +2 -0
  114. package/dist/6540.js.map +1 -0
  115. package/dist/6606.js +1 -0
  116. package/dist/6606.js.map +1 -0
  117. package/dist/6720.js +1 -0
  118. package/dist/6720.js.map +1 -0
  119. package/dist/6824.js +1 -0
  120. package/dist/6824.js.map +1 -0
  121. package/dist/6942.js +1 -0
  122. package/dist/6942.js.map +1 -0
  123. package/dist/71.js +1 -0
  124. package/dist/71.js.map +1 -0
  125. package/dist/7207.js +1 -0
  126. package/dist/7207.js.map +1 -0
  127. package/dist/7255.js +1 -0
  128. package/dist/7255.js.map +1 -0
  129. package/dist/7420.js +1 -0
  130. package/dist/7420.js.map +1 -0
  131. package/dist/7521.js +1 -0
  132. package/dist/7521.js.map +1 -0
  133. package/dist/7549.js +1 -0
  134. package/dist/7549.js.map +1 -0
  135. package/dist/7557.js +1 -0
  136. package/dist/7557.js.map +1 -0
  137. package/dist/7717.js +1 -0
  138. package/dist/7717.js.map +1 -0
  139. package/dist/7830.js +2 -0
  140. package/dist/7830.js.map +1 -0
  141. package/dist/7857.js +1 -0
  142. package/dist/7857.js.map +1 -0
  143. package/dist/7941.js +1 -0
  144. package/dist/7941.js.map +1 -0
  145. package/dist/8091.js +1 -0
  146. package/dist/8091.js.map +1 -0
  147. package/dist/810.js +1 -0
  148. package/dist/810.js.map +1 -0
  149. package/dist/8146.js +1 -0
  150. package/dist/8146.js.map +1 -0
  151. package/dist/850.js +1 -0
  152. package/dist/850.js.map +1 -0
  153. package/dist/8558.js +1 -0
  154. package/dist/8558.js.map +1 -0
  155. package/dist/8684.js +1 -0
  156. package/dist/8684.js.map +1 -0
  157. package/dist/8895.js +1 -0
  158. package/dist/8895.js.map +1 -0
  159. package/dist/9070.js +1 -0
  160. package/dist/9070.js.map +1 -0
  161. package/dist/9091.js +1 -0
  162. package/dist/9091.js.map +1 -0
  163. package/dist/9093.js +1 -0
  164. package/dist/9093.js.map +1 -0
  165. package/dist/9338.js +1 -0
  166. package/dist/9338.js.map +1 -0
  167. package/dist/9349.js +1 -0
  168. package/dist/9349.js.map +1 -0
  169. package/dist/9418.js +2 -0
  170. package/dist/9418.js.LICENSE.txt +1 -0
  171. package/dist/9418.js.map +1 -0
  172. package/dist/9428.js +1 -0
  173. package/dist/9428.js.map +1 -0
  174. package/dist/9583.js +2 -0
  175. package/dist/9583.js.map +1 -0
  176. package/dist/9871.js +1 -0
  177. package/dist/9871.js.map +1 -0
  178. package/dist/esm-dha-workflow-app.js +1 -1
  179. package/dist/esm-dha-workflow-app.js.buildmanifest.json +1830 -221
  180. package/dist/esm-dha-workflow-app.js.map +1 -1
  181. package/dist/main.js +1 -1
  182. package/dist/main.js.map +1 -1
  183. package/dist/routes.json +1 -1
  184. package/local-config.json +9 -0
  185. package/package.json +16 -6
  186. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  187. package/src/admissions/admission-request-list/admission-request-list.tsx +263 -0
  188. package/src/admissions/admissions-dashboard.component.scss +15 -0
  189. package/src/admissions/admissions-dashboard.component.tsx +277 -0
  190. package/src/admissions/admissions.resource.ts +233 -0
  191. package/src/admissions/admitted-list/admitted-patients-list.tsx +206 -0
  192. package/src/admissions/awaiting-discharge-list/awaiting-discharge-list.tsx +197 -0
  193. package/src/admissions/bed-assigment-request/bed-assignment-request-list.tsx +134 -0
  194. package/src/admissions/constants/index.ts +33 -0
  195. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  196. package/src/admissions/discharged-list/discharged-list.tsx +67 -0
  197. package/src/admissions/form-entry-workspace/form-entry-workspace.tsx +62 -0
  198. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  199. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  200. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  201. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  202. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  203. package/src/admissions/modal/add-bill-items/add-bill-items.modal.scss +17 -0
  204. package/src/admissions/modal/add-bill-items/add-bill-items.modal.tsx +233 -0
  205. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  206. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  207. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  208. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +111 -0
  209. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  210. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  211. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  212. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  213. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  214. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +86 -0
  215. package/src/admissions/types/index.ts +263 -0
  216. package/src/appointments/appointments.component.scss +6 -0
  217. package/src/appointments/appointments.component.tsx +8 -1
  218. package/src/billing/api/billing.api.ts +139 -0
  219. package/src/billing/billing-claims.resource.ts +916 -0
  220. package/src/billing/billing-dashboard-link.component.tsx +31 -0
  221. package/src/billing/billing-dashboard-reset.ts +27 -0
  222. package/src/billing/billing-root.tsx +42 -0
  223. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  224. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  225. package/src/billing/dashboard/v2/active-visits/active-visits.component.tsx +257 -0
  226. package/src/billing/dashboard/v2/active-visits/active-visits.resource.ts +85 -0
  227. package/src/billing/dashboard/v2/active-visits/active-visits.scss +15 -0
  228. package/src/billing/dashboard/v2/active-visits.component.tsx +102 -0
  229. package/src/billing/dashboard/v2/admissions/admission-requests-tab.component.tsx +79 -0
  230. package/src/billing/dashboard/v2/billing-claims-dashboard.component.scss +209 -0
  231. package/src/billing/dashboard/v2/billing-claims-dashboard.component.tsx +396 -0
  232. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.scss +90 -0
  233. package/src/billing/dashboard/v2/cash-checklist/bill-document.component.tsx +101 -0
  234. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.scss +199 -0
  235. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.component.tsx +361 -0
  236. package/src/billing/dashboard/v2/cash-checklist/cash-checklist.resource.ts +239 -0
  237. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.scss +246 -0
  238. package/src/billing/dashboard/v2/cash-checklist/payment-drawer.component.tsx +182 -0
  239. package/src/billing/dashboard/v2/claim-statuses.ts +143 -0
  240. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  241. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +35 -0
  242. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.scss +67 -0
  243. package/src/billing/dashboard/v2/claim-visits/claim-diagnosis-details/claim-diagnosis-panel.component.tsx +90 -0
  244. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.scss +28 -0
  245. package/src/billing/dashboard/v2/claim-visits/claim-doctors/claim-doctors.tsx +36 -0
  246. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.scss +119 -0
  247. package/src/billing/dashboard/v2/claim-visits/claim-history/claim-history.component.tsx +198 -0
  248. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.scss +5 -0
  249. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +160 -0
  250. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.scss +105 -0
  251. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/claim-intervention-panel.component.tsx +184 -0
  252. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.scss +161 -0
  253. package/src/billing/dashboard/v2/claim-visits/claim-intervention-details/intervention-attachments.component.tsx +328 -0
  254. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +96 -0
  255. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-document.component.tsx +236 -0
  256. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.scss +98 -0
  257. package/src/billing/dashboard/v2/claim-visits/claim-invoice-details/claim-invoice-panel.component.tsx +292 -0
  258. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +133 -0
  259. package/src/billing/dashboard/v2/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +217 -0
  260. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-by-token.component.tsx +150 -0
  261. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.scss +13 -0
  262. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-details-page.component.tsx +116 -0
  263. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.scss +338 -0
  264. package/src/billing/dashboard/v2/claim-visits/claim-visit-details/claim-visit-details.component.tsx +616 -0
  265. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.scss +5 -0
  266. package/src/billing/dashboard/v2/claim-visits/claim-visits.component.tsx +133 -0
  267. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  268. package/src/billing/dashboard/v2/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  269. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +17 -0
  270. package/src/billing/dashboard/v2/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +56 -0
  271. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  272. package/src/billing/dashboard/v2/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  273. package/src/billing/dashboard/v2/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  274. package/src/billing/dashboard/v2/claim-visits/shared/_empty-state.scss +28 -0
  275. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.scss +298 -0
  276. package/src/billing/dashboard/v2/claim-visits/shared/record-cards.component.tsx +252 -0
  277. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.scss +42 -0
  278. package/src/billing/dashboard/v2/claim-visits/shared/record-details.workspace.tsx +54 -0
  279. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.scss +61 -0
  280. package/src/billing/dashboard/v2/claim-visits/shared/record-table.component.tsx +150 -0
  281. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  282. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  283. package/src/billing/dashboard/v2/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  284. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.scss +595 -0
  285. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.component.tsx +810 -0
  286. package/src/billing/dashboard/v2/claim-workspace/claim-workspace.resource.ts +282 -0
  287. package/src/billing/dashboard/v2/claims-accounting/bill-utils.ts +134 -0
  288. package/src/billing/dashboard/v2/claims-accounting/claim-detail.component.tsx +346 -0
  289. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.scss +546 -0
  290. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.component.tsx +206 -0
  291. package/src/billing/dashboard/v2/claims-accounting/claims-accounting.resource.ts +337 -0
  292. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.scss +90 -0
  293. package/src/billing/dashboard/v2/claims-accounting/invoice-document.component.tsx +90 -0
  294. package/src/billing/dashboard/v2/claims-accounting/remittances.component.tsx +169 -0
  295. package/src/billing/dashboard/v2/claims-accounting/remittances.resource.ts +46 -0
  296. package/src/billing/dashboard/v2/claims-accounting/status-meta.ts +25 -0
  297. package/src/billing/dashboard/v2/clearance/cash-patients.scss +18 -0
  298. package/src/billing/dashboard/v2/clearance/cash.component.tsx +145 -0
  299. package/src/billing/dashboard/v2/clearance/clearance.component.scss +84 -0
  300. package/src/billing/dashboard/v2/clearance/clearance.component.tsx +225 -0
  301. package/src/billing/dashboard/v2/clearance/pay-cash.component.tsx +202 -0
  302. package/src/billing/dashboard/v2/clearance/pay-cash.scss +28 -0
  303. package/src/billing/dashboard/v2/clearance/prepaid-services.component.tsx +112 -0
  304. package/src/billing/dashboard/v2/facility-bills/claim-status.ts +249 -0
  305. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.scss +140 -0
  306. package/src/billing/dashboard/v2/facility-bills/facility-bills.component.tsx +688 -0
  307. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  308. package/src/billing/dashboard/v2/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +267 -0
  309. package/src/billing/dashboard/v2/facility-bills/preauths.component.tsx +130 -0
  310. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.scss +22 -0
  311. package/src/billing/dashboard/v2/inpatient-requests/inpatient-requests.component.tsx +389 -0
  312. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.scss +0 -0
  313. package/src/billing/dashboard/v2/inpatient-requests/modal/start-inpatient-claim/start-inpatient-claim.component.tsx +0 -0
  314. package/src/billing/dashboard/v2/new-facility-bills/bills-table.component.tsx +78 -0
  315. package/src/billing/dashboard/v2/new-facility-bills/bills-table.scss +18 -0
  316. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.component.tsx +64 -0
  317. package/src/billing/dashboard/v2/new-facility-bills/new-facility-bills.scss +146 -0
  318. package/src/billing/dashboard/v2/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  319. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachment.component.tsx +157 -0
  320. package/src/billing/dashboard/v2/patient-bill-details/attachments/attachments.scss +92 -0
  321. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  322. package/src/billing/dashboard/v2/patient-bill-details/attachments/case-summary/case-summary.tsx +326 -0
  323. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  324. package/src/billing/dashboard/v2/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +269 -0
  325. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  326. package/src/billing/dashboard/v2/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +124 -0
  327. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.component.tsx +152 -0
  328. package/src/billing/dashboard/v2/patient-bill-details/attachments/final-bill.scss +225 -0
  329. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  330. package/src/billing/dashboard/v2/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +173 -0
  331. package/src/billing/dashboard/v2/patient-bill-details/attachments/generate-attachments.component.tsx +371 -0
  332. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.component.tsx +151 -0
  333. package/src/billing/dashboard/v2/patient-bill-details/attachments/invoice.scss +225 -0
  334. package/src/billing/dashboard/v2/patient-bill-details/attachments/type.ts +44 -0
  335. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.scss +107 -0
  336. package/src/billing/dashboard/v2/patient-bill-details/bill-details/bill-details.tsx +508 -0
  337. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.scss +30 -0
  338. package/src/billing/dashboard/v2/patient-bill-details/bill-details-page.component.tsx +94 -0
  339. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.scss +89 -0
  340. package/src/billing/dashboard/v2/patient-bill-details/claim-details/claim-details-skeleton.component.tsx +53 -0
  341. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.scss +32 -0
  342. package/src/billing/dashboard/v2/patient-bill-details/claim-details/patient-claim-details.component.tsx +215 -0
  343. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  344. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  345. package/src/billing/dashboard/v2/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +187 -0
  346. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.scss +153 -0
  347. package/src/billing/dashboard/v2/patient-bill-details/patient-bill-details.tsx +458 -0
  348. package/src/billing/dashboard/v2/patient-bill-details/payment-mode.ts +124 -0
  349. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.scss +27 -0
  350. package/src/billing/dashboard/v2/patient-bill-details/workspaces/add-claim-line/add-claim-line.workspace.tsx +223 -0
  351. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.scss +27 -0
  352. package/src/billing/dashboard/v2/patient-bill-details/workspaces/bill-item-payment/bill-item-payment.workspace.tsx +109 -0
  353. package/src/billing/dashboard/v2/preauth/preauth-attachments.component.tsx +389 -0
  354. package/src/billing/dashboard/v2/preauth/preauth-list.component.scss +38 -0
  355. package/src/billing/dashboard/v2/preauth/preauth-list.component.tsx +241 -0
  356. package/src/billing/dashboard/v2/preauth/preauth-status-tag.component.tsx +75 -0
  357. package/src/billing/dashboard/v2/preauth/preauth-typed-fields.md +125 -0
  358. package/src/billing/dashboard/v2/preauth/preauth.resource.ts +1067 -0
  359. package/src/billing/dashboard/v2/preauth/preauth.workspace.scss +91 -0
  360. package/src/billing/dashboard/v2/preauth/preauth.workspace.tsx +1802 -0
  361. package/src/billing/dashboard/v2/preauth/preauthorizations-tab.component.tsx +49 -0
  362. package/src/billing/dashboard/v2/sha-claims/sha-claims-table.component.tsx +36 -0
  363. package/src/billing/dashboard/v2/sha-claims/sha-claims.component.tsx +60 -0
  364. package/src/billing/dashboard/v2/sha-claims/sha-claims.scss +8 -0
  365. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.scss +17 -0
  366. package/src/billing/dashboard/v2/shared/dash-board-card/dash-board-card.component.tsx +15 -0
  367. package/src/billing/dashboard/v2/shared/empty-state.component.scss +24 -0
  368. package/src/billing/dashboard/v2/shared/empty-state.component.tsx +13 -0
  369. package/src/billing/dashboard/v2/shared/scroll-to-top.component.scss +54 -0
  370. package/src/billing/dashboard/v2/shared/scroll-to-top.component.tsx +54 -0
  371. package/src/billing/dashboard/v2/shared/table-toolbar.component.scss +77 -0
  372. package/src/billing/dashboard/v2/shared/table-toolbar.component.tsx +48 -0
  373. package/src/billing/dashboard/v2/types/index.ts +514 -0
  374. package/src/billing/dashboard/v3/active-visits/active-visits.component.tsx +256 -0
  375. package/src/billing/dashboard/v3/active-visits/active-visits.resource.ts +57 -0
  376. package/src/billing/dashboard/v3/active-visits/active-visits.scss +15 -0
  377. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.scss +90 -0
  378. package/src/billing/dashboard/v3/cash-checklist/bill-document.component.tsx +101 -0
  379. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.scss +199 -0
  380. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.component.tsx +361 -0
  381. package/src/billing/dashboard/v3/cash-checklist/cash-checklist.resource.ts +240 -0
  382. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.scss +246 -0
  383. package/src/billing/dashboard/v3/cash-checklist/payment-drawer.component.tsx +182 -0
  384. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.scss +0 -0
  385. package/src/billing/dashboard/v3/claim-visits/claim-diagnosis-details/claim-diagnosis-details.component.tsx +44 -0
  386. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.scss +5 -0
  387. package/src/billing/dashboard/v3/claim-visits/claim-doctors/claim-doctors.tsx +42 -0
  388. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.scss +10 -0
  389. package/src/billing/dashboard/v3/claim-visits/claim-documents/claim-documents.tsx +25 -0
  390. package/src/billing/dashboard/v3/claim-visits/claim-intervention-details/claim-intervention-details.component.tsx +220 -0
  391. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.scss +6 -0
  392. package/src/billing/dashboard/v3/claim-visits/claim-invoice-details/claim-invoice-details.component.tsx +85 -0
  393. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.scss +0 -0
  394. package/src/billing/dashboard/v3/claim-visits/claim-invoice-line-details/claim-invoice-line-details.component.tsx +109 -0
  395. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.scss +97 -0
  396. package/src/billing/dashboard/v3/claim-visits/claim-visit-details/claim-visit-details.component.tsx +343 -0
  397. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.scss +5 -0
  398. package/src/billing/dashboard/v3/claim-visits/claim-visits.component.tsx +139 -0
  399. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.scss +5 -0
  400. package/src/billing/dashboard/v3/claim-visits/modal/claim-doctors/add-claim-doctor/add-claim-doctor.modal.tsx +49 -0
  401. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.scss +7 -0
  402. package/src/billing/dashboard/v3/claim-visits/modal/claim-invoice-lines/claim-invoice-lines.modal.tsx +35 -0
  403. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.scss +6 -0
  404. package/src/billing/dashboard/v3/claim-visits/modal/claim-visit-details/claim-visit-details.modal.tsx +33 -0
  405. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.scss +0 -0
  406. package/src/billing/dashboard/v3/claim-visits/modal/close-claim/close-claim.modal.tsx +129 -0
  407. package/src/billing/dashboard/v3/claim-visits/modal/submit-claim/submit-claim.modal.tsx +204 -0
  408. package/src/billing/dashboard/v3/claim-visits/payer-preview/index.scss +140 -0
  409. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-tile.component.tsx +55 -0
  410. package/src/billing/dashboard/v3/claim-visits/payer-preview/payer-preview-workspace.component.tsx +157 -0
  411. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-doctors.component.tsx +54 -0
  412. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-lines.component.tsx +48 -0
  413. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-claim-notes.component.tsx +47 -0
  414. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-diagnoses.component.tsx +44 -0
  415. package/src/billing/dashboard/v3/claim-visits/payer-preview/tables/payer-interventions.component.tsx +44 -0
  416. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.resource.ts +51 -0
  417. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.scss +191 -0
  418. package/src/billing/dashboard/v3/claim-visits/switch-intervention/switch-intervention.workspace.tsx +648 -0
  419. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.scss +595 -0
  420. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.component.tsx +810 -0
  421. package/src/billing/dashboard/v3/claim-workspace/claim-workspace.resource.ts +282 -0
  422. package/src/billing/dashboard/v3/claims-accounting/bill-utils.ts +134 -0
  423. package/src/billing/dashboard/v3/claims-accounting/claim-detail.component.tsx +346 -0
  424. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.scss +546 -0
  425. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.component.tsx +206 -0
  426. package/src/billing/dashboard/v3/claims-accounting/claims-accounting.resource.ts +337 -0
  427. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.scss +90 -0
  428. package/src/billing/dashboard/v3/claims-accounting/invoice-document.component.tsx +90 -0
  429. package/src/billing/dashboard/v3/claims-accounting/remittances.component.tsx +169 -0
  430. package/src/billing/dashboard/v3/claims-accounting/remittances.resource.ts +46 -0
  431. package/src/billing/dashboard/v3/claims-accounting/status-meta.ts +25 -0
  432. package/src/billing/dashboard/v3/clearance/clearance.component.scss +100 -0
  433. package/src/billing/dashboard/v3/clearance/clearance.component.tsx +0 -0
  434. package/src/billing/dashboard/v3/clearance/prepaid-services.component.tsx +112 -0
  435. package/src/billing/dashboard/v3/facility-bills/claim-status.ts +243 -0
  436. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.scss +72 -0
  437. package/src/billing/dashboard/v3/facility-bills/facility-bills.component.tsx +181 -0
  438. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/pending-preauths.component.tsx +132 -0
  439. package/src/billing/dashboard/v3/facility-bills/preauths-datatables/preauth-preview-table.component.tsx +232 -0
  440. package/src/billing/dashboard/v3/facility-bills/preauths.component.tsx +127 -0
  441. package/src/billing/dashboard/v3/patient-bill-details/attachments/add-attachments.component.tsx +223 -0
  442. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachment.component.tsx +157 -0
  443. package/src/billing/dashboard/v3/patient-bill-details/attachments/attachments.scss +92 -0
  444. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary-helper.ts +58 -0
  445. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.scss +295 -0
  446. package/src/billing/dashboard/v3/patient-bill-details/attachments/case-summary/case-summary.tsx +287 -0
  447. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.scss +238 -0
  448. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-chart.tsx +317 -0
  449. package/src/billing/dashboard/v3/patient-bill-details/attachments/dialysis/dialysis-helper.ts +94 -0
  450. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.scss +96 -0
  451. package/src/billing/dashboard/v3/patient-bill-details/attachments/discharge-summary/discharge-summary.tsx +126 -0
  452. package/src/billing/dashboard/v3/patient-bill-details/attachments/final-bill.component.tsx +75 -0
  453. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.scss +182 -0
  454. package/src/billing/dashboard/v3/patient-bill-details/attachments/general-discharge-summary/general-discharge-summary.tsx +253 -0
  455. package/src/billing/dashboard/v3/patient-bill-details/attachments/generate-attachments.component.tsx +345 -0
  456. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.component.tsx +150 -0
  457. package/src/billing/dashboard/v3/patient-bill-details/attachments/invoice.scss +225 -0
  458. package/src/billing/dashboard/v3/patient-bill-details/attachments/type.ts +259 -0
  459. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.scss +17 -0
  460. package/src/billing/dashboard/v3/patient-bill-details/bill-details/bill-details.tsx +260 -0
  461. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.scss +0 -0
  462. package/src/billing/dashboard/v3/patient-bill-details/claim-details/patient-claim-details.component.tsx +68 -0
  463. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.scss +0 -0
  464. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-diagnosis/add-claim-diagnosis.modal.tsx +99 -0
  465. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.scss +14 -0
  466. package/src/billing/dashboard/v3/patient-bill-details/modals/add-claim-line/add-claim-line.modal.tsx +112 -0
  467. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.scss +6 -0
  468. package/src/billing/dashboard/v3/patient-bill-details/modals/bill-item-payment/bill-item-payment.modal.tsx +139 -0
  469. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.scss +85 -0
  470. package/src/billing/dashboard/v3/patient-bill-details/patient-bill-details.tsx +343 -0
  471. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.scss +0 -0
  472. package/src/billing/dashboard/v3/patient-bill-details/visit-diagnosis-details/visit-diagnosis-details.component.tsx +92 -0
  473. package/src/billing/dashboard/v3/preauth/elective/elective-authorize.resource.ts +284 -0
  474. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.scss +125 -0
  475. package/src/billing/dashboard/v3/preauth/elective/elective-preauth-request.workspace.tsx +1184 -0
  476. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.scss +15 -0
  477. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.component.tsx +377 -0
  478. package/src/billing/dashboard/v3/preauth/elective/elective-preauth.resource.ts +1378 -0
  479. package/src/billing/dashboard/v3/preauth/elective/elective-requests-list.component.tsx +357 -0
  480. package/src/billing/dashboard/v3/preauth/preauth-attachments.component.tsx +389 -0
  481. package/src/billing/dashboard/v3/preauth/preauth-list.component.scss +34 -0
  482. package/src/billing/dashboard/v3/preauth/preauth-list.component.tsx +300 -0
  483. package/src/billing/dashboard/v3/preauth/preauth-status-tag.component.tsx +75 -0
  484. package/src/billing/dashboard/v3/preauth/preauth-typed-fields.md +125 -0
  485. package/src/billing/dashboard/v3/preauth/preauth.resource.ts +1197 -0
  486. package/src/billing/dashboard/v3/preauth/preauth.workspace.scss +176 -0
  487. package/src/billing/dashboard/v3/preauth/preauth.workspace.tsx +2266 -0
  488. package/src/billing/dashboard/v3/preauth/preauthorizations-tab.component.tsx +55 -0
  489. package/src/billing/dashboard/v3/shared/empty-state.component.scss +25 -0
  490. package/src/billing/dashboard/v3/shared/empty-state.component.tsx +13 -0
  491. package/src/billing/dashboard/v3/shared/table-toolbar.component.scss +64 -0
  492. package/src/billing/dashboard/v3/shared/table-toolbar.component.tsx +48 -0
  493. package/src/billing/dashboard/v3/types/index.ts +384 -0
  494. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.extension.tsx +55 -0
  495. package/src/billing/extensions/generate-order-bill-button/generate-order-bill-button.scss +16 -0
  496. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  497. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +509 -0
  498. package/src/billing/invoice/bill.resource.ts +47 -0
  499. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  500. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  501. package/src/billing/invoice/invoice.scss +113 -0
  502. package/src/billing/invoice/invoice.tsx +1441 -0
  503. package/src/billing/invoice/line-items/line-items.scss +0 -0
  504. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  505. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  506. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  507. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  508. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  509. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  510. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  511. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  512. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  513. package/src/billing/maternity-discharge.resource.ts +21 -0
  514. package/src/billing/types/index.ts +354 -0
  515. package/src/billing/utils/index.ts +17 -0
  516. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  517. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  518. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +130 -0
  519. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  520. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +656 -0
  521. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +12 -0
  522. package/src/bookings/bookings.component.scss +7 -0
  523. package/src/bookings/bookings.component.tsx +35 -0
  524. package/src/bookings/daily/daily-bookings.resource.ts +2 -1
  525. package/src/case-summary/case-summary.extension.scss +13 -0
  526. package/src/case-summary/case-summary.extension.tsx +40 -0
  527. package/src/case-summary/case-summary.resource.test.ts +69 -0
  528. package/src/case-summary/case-summary.resource.ts +52 -0
  529. package/src/case-summary/components/case-summary-printable.component.scss +174 -0
  530. package/src/case-summary/components/case-summary-printable.component.tsx +288 -0
  531. package/src/case-summary/components/case-summary-printable.utils.ts +51 -0
  532. package/src/case-summary/types/case-summary.types.ts +152 -0
  533. package/src/claims/claims.component.scss +70 -0
  534. package/src/claims/claims.component.tsx +743 -0
  535. package/src/claims/claims.resource.ts +1840 -0
  536. package/src/claims/index.ts +365 -0
  537. package/src/claims/interventions.resource.ts +131 -0
  538. package/src/claims/utils.ts +64 -0
  539. package/src/config-schema.ts +149 -1
  540. package/src/context/patient-context.tsx +27 -0
  541. package/src/createDashboardLink.tsx +9 -0
  542. package/src/dashboard/charts/chart.component.scss +24 -0
  543. package/src/dashboard/charts/chart.component.tsx +56 -0
  544. package/src/dashboard/dashboard.component.scss +48 -3
  545. package/src/dashboard/dashboard.component.tsx +29 -38
  546. package/src/dashboard/overview/overview.component.scss +40 -59
  547. package/src/dashboard/overview/overview.component.tsx +55 -41
  548. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  549. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  550. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  551. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  552. package/src/dashboard-meta/case-summary.meta.ts +6 -0
  553. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  554. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  555. package/src/dashboard-meta/elective-preauth.meta.ts +6 -0
  556. package/src/dashboard-meta/emt-dashboard.meta.ts +6 -0
  557. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  558. package/src/dashboard-meta/maternity-dashboard.meta.ts +6 -0
  559. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  560. package/src/dashboard-meta/pharmacy-dashboard.meta.ts +6 -0
  561. package/src/dashboard-meta/queue-dashboard.meta.ts +6 -0
  562. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  563. package/src/dashboard-meta/registry-dashboard.meta.ts +6 -0
  564. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  565. package/src/dashboard-meta/specialized-clinics-dashboard.meta.ts +6 -0
  566. package/src/dashboard-meta/triage-dashboard.meta.ts +6 -0
  567. package/src/emt/cr-lookup.resource.test.ts +88 -0
  568. package/src/emt/cr-lookup.resource.ts +42 -0
  569. package/src/emt/emt-queue.component.test.tsx +353 -0
  570. package/src/emt/emt-queue.component.tsx +463 -0
  571. package/src/emt/emt-queue.scss +85 -0
  572. package/src/emt/emt.resource.test.ts +247 -0
  573. package/src/emt/emt.resource.ts +150 -0
  574. package/src/emt/handover-modal/handover-modal.component.test.tsx +273 -0
  575. package/src/emt/handover-modal/handover-modal.component.tsx +541 -0
  576. package/src/emt/handover-modal/handover-modal.scss +113 -0
  577. package/src/emt/types/emt.types.ts +137 -0
  578. package/src/index.ts +204 -6
  579. package/src/mnch/maternity/maternity-queues.component.scss +7 -0
  580. package/src/mnch/maternity/maternity-queues.component.tsx +32 -0
  581. package/src/mnch/maternity/queues/triage/maternity-triage.tsx +15 -0
  582. package/src/mnch/mch/mch-queues.component.scss +10 -0
  583. package/src/mnch/mch/mch-queues.component.tsx +36 -0
  584. package/src/mnch/mch/queues/consultation/mch-consultation.tsx +18 -0
  585. package/src/mnch/mch/queues/triage/mch-triage.tsx +15 -0
  586. package/src/mnch/mnch-root.tsx +17 -0
  587. package/src/mortuary/mortuary.component.tsx +13 -0
  588. package/src/pharmacy/pharmacy.component.scss +16 -0
  589. package/src/pharmacy/pharmacy.component.tsx +11 -6
  590. package/src/registers/registers.component.tsx +8 -0
  591. package/src/registry/drawer/emr-compare.component.scss +263 -0
  592. package/src/registry/drawer/emr-compare.component.tsx +302 -0
  593. package/src/registry/drawer/emr-compare.resource.ts +181 -0
  594. package/src/registry/drawer/emr-create-preview.component.tsx +123 -0
  595. package/src/registry/drawer/otp-verification-step.component.tsx +398 -0
  596. package/src/registry/drawer/pomsf-balance.util.test.ts +177 -0
  597. package/src/registry/drawer/pomsf-balance.util.ts +79 -0
  598. package/src/registry/drawer/verification.resource.ts +60 -0
  599. package/src/registry/drawer/workflow-drawer.component.scss +1242 -0
  600. package/src/registry/drawer/workflow-drawer.component.tsx +1478 -0
  601. package/src/registry/eligibility/eligibility-details/eligibility-details.scss +38 -0
  602. package/src/registry/eligibility/eligibility-details/eligibility-details.tsx +101 -0
  603. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +16 -0
  604. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +120 -0
  605. package/src/registry/eligibility/modal/eligibility-details.modal.scss +0 -0
  606. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +45 -0
  607. package/src/registry/hie.resource.ts +466 -0
  608. package/src/registry/hie.types.ts +63 -0
  609. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.scss +277 -0
  610. package/src/registry/modal/biometrics-verification-modal/biometrics-verification-modal.tsx +218 -0
  611. package/src/registry/modal/biometrics-verification-modal/type.ts +39 -0
  612. package/src/registry/modal/client-details-modal/client-details-modal.tsx +65 -29
  613. package/src/registry/modal/otp-modal/otp-whitlisting-modal.component.tsx +809 -0
  614. package/src/registry/modal/otp-modal/otp-whitlisting-modal.scss +354 -0
  615. package/src/registry/modal/otp-modal/otp-whitlisting.scss +0 -0
  616. package/src/registry/modal/otp-verification-modal/claims-consent.scss +72 -0
  617. package/src/registry/modal/otp-verification-modal/claims-consent.tsx +135 -0
  618. package/src/registry/modal/otp-verification-modal/extension/claims-consent.extension.tsx +130 -0
  619. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +30 -0
  620. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +154 -54
  621. package/src/registry/modal/send-to-triage/payment-details.tsx +120 -0
  622. package/src/registry/modal/send-to-triage/payment-method.component.tsx +54 -0
  623. package/src/registry/modal/send-to-triage/send-to-queue.modal.tsx +981 -0
  624. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +156 -3
  625. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +1094 -135
  626. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.scss +34 -0
  627. package/src/registry/modal/start-patient-visit/start-patient-visit.modal.tsx +231 -0
  628. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  629. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  630. package/src/registry/registration-list/registration-list.component.scss +32 -0
  631. package/src/registry/registration-list/registration-list.component.tsx +103 -0
  632. package/src/registry/registry-entry.tsx +11 -0
  633. package/src/registry/registry.component.scss +402 -78
  634. package/src/registry/registry.component.tsx +602 -222
  635. package/src/registry/registry.resource.ts +22 -3
  636. package/src/registry/types/index.ts +118 -9
  637. package/src/registry/utils/error-handler.ts +54 -0
  638. package/src/registry/utils/format-dependant-display-data.ts +1 -1
  639. package/src/registry/utils/hie-client-adapter.ts +7 -4
  640. package/src/registry/utils/mask-data.ts +40 -0
  641. package/src/registry/utils/phone-number-formatter.ts +11 -0
  642. package/src/resources/dashboard.resource.ts +20 -0
  643. package/src/resources/identifier-types.ts +2 -0
  644. package/src/resources/patient-resource.ts +6 -1
  645. package/src/resources/queue.resource.ts +24 -1
  646. package/src/resources/superset.resource.ts +21 -0
  647. package/src/resources/visit.resource.ts +19 -1
  648. package/src/root.component.tsx +10 -5
  649. package/src/routes.json +477 -23
  650. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  651. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +153 -0
  652. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  653. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +182 -0
  654. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  655. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  656. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  657. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  658. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  659. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  660. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  661. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  662. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  663. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  664. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  665. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +34 -0
  666. package/src/service-queues/consultation/consultation.component.tsx +9 -0
  667. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  668. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  669. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  670. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +110 -0
  671. package/src/service-queues/modals/move/move-patient.component.scss +1 -1
  672. package/src/service-queues/modals/move/move-patient.component.tsx +31 -17
  673. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  674. package/src/service-queues/queue-list/queue-list.component.scss +37 -0
  675. package/src/service-queues/queue-list/queue-list.component.tsx +256 -56
  676. package/src/service-queues/service-queue/service-queue.component.tsx +151 -8
  677. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +5 -0
  678. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +36 -7
  679. package/src/service-queues/service-queue.tsx +22 -16
  680. package/src/service-queues/service-queues.resource.ts +197 -1
  681. package/src/service-queues/service.resource.ts +1 -1
  682. package/src/shared/constants/concepts.ts +50 -0
  683. package/src/shared/constants/patient-category.ts +6 -0
  684. package/src/shared/constants/patient-type.ts +10 -0
  685. package/src/shared/constants/visit-types.ts +7 -0
  686. package/src/shared/services/billing.resource.ts +75 -0
  687. package/src/shared/services/claims.resource.ts +47 -0
  688. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  689. package/src/shared/services/client-payment.resource.ts +17 -0
  690. package/src/shared/services/consultation-clearance.resource.ts +210 -0
  691. package/src/shared/services/eligibility.resource.ts +20 -0
  692. package/src/shared/services/encounters.resource.ts +33 -0
  693. package/src/shared/services/location.resource.ts +9 -0
  694. package/src/shared/types/index.ts +156 -0
  695. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  696. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  697. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  698. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  699. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.scss +39 -0
  700. package/src/shared/ui/facility-worker-slot/facility-worker.component-slot.component.tsx +19 -0
  701. package/src/shared/ui/otp-input/otp-input.component.scss +14 -0
  702. package/src/shared/ui/otp-input/otp-input.component.tsx +97 -0
  703. package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.tsx +6 -3
  704. package/src/shared/ui/timer/timer.component.scss +5 -0
  705. package/src/shared/ui/timer/timer.component.tsx +40 -0
  706. package/src/shared/utils/get-base-url.ts +15 -0
  707. package/src/shared/utils/get-tag-type.ts +75 -0
  708. package/src/side-nav-menu/mnch-nav-link-config.ts +16 -0
  709. package/src/side-nav-menu/mnch-nav-links.tsx +42 -0
  710. package/src/side-nav-menu/nav-link-config.ts +5 -5
  711. package/src/side-nav-menu/specialized-clinics-nav-link-config.ts +36 -0
  712. package/src/side-nav-menu/specialized-clinics-nav-links.tsx +42 -0
  713. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.scss +7 -0
  714. package/src/specialized-clinics/critital-care-unit/critical-care-unit-queues.component.tsx +36 -0
  715. package/src/specialized-clinics/critital-care-unit/queues/consultation/critical-care-unit-consultation.tsx +15 -0
  716. package/src/specialized-clinics/critital-care-unit/queues/triage/critical-care-unit-triage.tsx +15 -0
  717. package/src/specialized-clinics/dental/dental-queues.component.scss +7 -0
  718. package/src/specialized-clinics/dental/dental-queues.component.tsx +36 -0
  719. package/src/specialized-clinics/dental/queues/consultation/dental-consultation.tsx +15 -0
  720. package/src/specialized-clinics/dental/queues/triage/dental-triage.tsx +15 -0
  721. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.scss +7 -0
  722. package/src/specialized-clinics/diagnostic-and-imaging/diagnostic-and-imaging.component.tsx +36 -0
  723. package/src/specialized-clinics/diagnostic-and-imaging/queues/consultation/diagnosis-and-imaging-consultation.tsx +15 -0
  724. package/src/specialized-clinics/diagnostic-and-imaging/queues/triage/diagnosis-and-imaging-triage.tsx +15 -0
  725. package/src/specialized-clinics/oncology/oncology-queues.component.scss +7 -0
  726. package/src/specialized-clinics/oncology/oncology-queues.component.tsx +36 -0
  727. package/src/specialized-clinics/oncology/queues/consultation/oncology-consultation.tsx +15 -0
  728. package/src/specialized-clinics/oncology/queues/triage/oncology-triage.tsx +15 -0
  729. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.scss +7 -0
  730. package/src/specialized-clinics/ophthalmology/ophthalmology-queues.component.tsx +36 -0
  731. package/src/specialized-clinics/ophthalmology/queues/consultation/ophthalmology-consultation.tsx +15 -0
  732. package/src/specialized-clinics/ophthalmology/queues/triage/ophthalmology-triage.tsx +15 -0
  733. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.scss +7 -0
  734. package/src/specialized-clinics/psychiatry/psychiatry-queues.component.tsx +36 -0
  735. package/src/specialized-clinics/psychiatry/queues/consultation/psychiatry-consultation.tsx +15 -0
  736. package/src/specialized-clinics/psychiatry/queues/triage/psychiatry-triage.tsx +15 -0
  737. package/src/specialized-clinics/renal/queues/consultation/dialysis-consultation.tsx +15 -0
  738. package/src/specialized-clinics/renal/queues/triage/renal-triage.tsx +15 -0
  739. package/src/specialized-clinics/renal/renal-queues.component.scss +7 -0
  740. package/src/specialized-clinics/renal/renal-queues.component.tsx +36 -0
  741. package/src/specialized-clinics/specialized-clinics-root.tsx +27 -0
  742. package/src/triage/triage.component.scss +6 -0
  743. package/src/triage/triage.component.tsx +4 -0
  744. package/src/types/types.ts +56 -1
  745. package/webpack.config.js +54 -1
  746. package/dist/104.js +0 -2
  747. package/dist/104.js.map +0 -1
  748. package/dist/15.js +0 -1
  749. package/dist/15.js.map +0 -1
  750. package/dist/184.js +0 -2
  751. package/dist/184.js.map +0 -1
  752. package/dist/197.js +0 -1
  753. package/dist/246.js +0 -2
  754. package/dist/246.js.map +0 -1
  755. package/dist/255.js +0 -1
  756. package/dist/255.js.map +0 -1
  757. package/dist/300.js +0 -1
  758. package/dist/335.js +0 -1
  759. package/dist/339.js +0 -1
  760. package/dist/339.js.map +0 -1
  761. package/dist/353.js +0 -1
  762. package/dist/353.js.map +0 -1
  763. package/dist/420.js +0 -1
  764. package/dist/420.js.map +0 -1
  765. package/dist/540.js +0 -2
  766. package/dist/540.js.map +0 -1
  767. package/dist/55.js +0 -1
  768. package/dist/652.js +0 -1
  769. package/dist/709.js +0 -1
  770. package/dist/709.js.map +0 -1
  771. package/dist/710.js +0 -2
  772. package/dist/710.js.map +0 -1
  773. package/dist/729.js +0 -1
  774. package/dist/729.js.map +0 -1
  775. package/dist/752.js +0 -1
  776. package/dist/752.js.map +0 -1
  777. package/dist/833.js +0 -1
  778. package/dist/833.js.map +0 -1
  779. package/dist/907.js +0 -1
  780. package/dist/907.js.map +0 -1
  781. package/dist/91.js +0 -1
  782. package/dist/91.js.map +0 -1
  783. package/dist/93.js +0 -1
  784. package/dist/93.js.map +0 -1
  785. package/dist/943.js +0 -1
  786. package/dist/943.js.map +0 -1
  787. package/dist/99.js +0 -1
  788. /package/dist/{104.js.LICENSE.txt → 2177.js.LICENSE.txt} +0 -0
  789. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  790. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
  791. /package/dist/{710.js.LICENSE.txt → 7830.js.LICENSE.txt} +0 -0
  792. /package/dist/{246.js.LICENSE.txt → 9583.js.LICENSE.txt} +0 -0
  793. /package/src/{service-queues/service-queue/stats → shared/ui}/stat-card/stat-card.component.scss +0 -0
@@ -0,0 +1,1197 @@
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
+
12
+ const PREAUTH_CODE_KEY = 'ampath.preauthCode';
13
+
14
+ export const asBool = (v: unknown): boolean => {
15
+ if (typeof v === 'boolean') return v;
16
+ if (typeof v === 'number') return v === 1;
17
+ if (typeof v === 'string') {
18
+ const s = v.trim().toLowerCase();
19
+ return s === 'true' || s === '1' || s === 'yes';
20
+ }
21
+ return false;
22
+ };
23
+
24
+ /** Score how well a billable_service name matches an intervention / service hint. */
25
+ function scoreBillableServiceMatch(billableService: string | null | undefined, hint: string | null | undefined): number {
26
+ const a = (billableService ?? '').toLowerCase().trim();
27
+ const b = (hint ?? '').toLowerCase().trim();
28
+ if (!a || !b) return 0;
29
+ if (a === b) return 100;
30
+ if (a.includes(b) || b.includes(a)) return 80;
31
+ const tokensA = a.split(/[^a-z0-9]+/).filter((t) => t.length > 2);
32
+ const tokensB = b.split(/[^a-z0-9]+/).filter((t) => t.length > 2);
33
+ if (!tokensA.length || !tokensB.length) return 0;
34
+ const overlap = tokensA.filter((t) => tokensB.includes(t)).length;
35
+ return overlap * 15;
36
+ }
37
+
38
+ /**
39
+ * Pick the bill line for a preauth intervention.
40
+ * Same intervention_code can appear on multiple lines (e.g. HEMOGLOBIN + HEMODIALYSIS) —
41
+ * prefer the line whose billable_service best matches the service hint / intervention name.
42
+ */
43
+ export function pickBillLineForIntervention(
44
+ bills: PatientFacilityBillDetails[],
45
+ interventionCode: string,
46
+ serviceHint?: string | null,
47
+ ): PatientFacilityBillDetails | null {
48
+ const code = (interventionCode ?? '').trim();
49
+ if (!code || !bills?.length) return null;
50
+
51
+ const byCode = bills.filter((b) => (b.intervention_code ?? '').trim() === code);
52
+ if (!byCode.length) return null;
53
+
54
+ let best: PatientFacilityBillDetails = byCode[0];
55
+ let bestRanked = -1;
56
+ for (const line of byCode) {
57
+ const score = scoreBillableServiceMatch(line.billable_service, serviceHint);
58
+ const price = Number(line.item_price ?? 0) || 0;
59
+ // Name match dominates; among ties prefer higher item_price.
60
+ const ranked = score * 1_000_000 + price;
61
+ if (ranked > bestRanked) {
62
+ bestRanked = ranked;
63
+ best = line;
64
+ }
65
+ }
66
+ return best;
67
+ }
68
+
69
+ export function unitPriceFromBillLine(line: PatientFacilityBillDetails | null | undefined): string {
70
+ if (!line) return '';
71
+ const price = line.item_price ?? line.item_total_price;
72
+ if (price == null || price === ('' as unknown)) return '';
73
+ const n = Number(price);
74
+ return Number.isFinite(n) ? String(n) : String(price).trim();
75
+ }
76
+
77
+ /** SHA coverage flags for an intervention_code (from interventions coverage API). */
78
+ export type ShaInterventionPreauthFlags = {
79
+ needsPreauth: boolean;
80
+ needsManualPreauthApproval: boolean;
81
+ intervention?: Intervention | null;
82
+ };
83
+
84
+ /**
85
+ * Bill lines that need elective preauth (`needsManualPreauthApproval`) and are not yet approved.
86
+ */
87
+ export const needsElectivePreauth = (item: PatientFacilityBillDetails): boolean => {
88
+ if (!item?.intervention_code) {
89
+ return false;
90
+ }
91
+ if (asBool(item.preauth_approved)) {
92
+ return false;
93
+ }
94
+ if (item.elective_preauth != null) {
95
+ return asBool(item.elective_preauth);
96
+ }
97
+ return false;
98
+ };
99
+
100
+ /**
101
+ * Bill lines that need normal (non-elective) preauth and are not yet approved.
102
+ * Prefer ETL flags when present; otherwise use SHA intervention coverage for the
103
+ * bill's `intervention_code` (`needsPreauth` && !`needsManualPreauthApproval`).
104
+ * @see https://hie-docs.dha.go.ke/docs/claims/process/preauths/normalPreauths
105
+ */
106
+ export const needsNormalPreauth = (
107
+ item: PatientFacilityBillDetails,
108
+ sha?: ShaInterventionPreauthFlags | null,
109
+ ): boolean => {
110
+ if (!item?.intervention_code) {
111
+ return false;
112
+ }
113
+ if (asBool(item.preauth_approved)) {
114
+ return false;
115
+ }
116
+ // Elective is a separate queue / workspace mode
117
+ if (asBool(item.elective_preauth)) {
118
+ return false;
119
+ }
120
+ // Prefer explicit ETL flags when the bill payload includes them
121
+ if (item.requires_preauth != null) {
122
+ return asBool(item.requires_preauth) && !asBool(item.elective_preauth);
123
+ }
124
+ if (item.normal_preauth != null) {
125
+ return asBool(item.normal_preauth);
126
+ }
127
+ // Facility bill lines often omit ETL flags — use SHA coverage for intervention_code
128
+ if (sha) {
129
+ return Boolean(sha.needsPreauth) && !Boolean(sha.needsManualPreauthApproval);
130
+ }
131
+ return false;
132
+ };
133
+
134
+ /**
135
+ * Resolve normal-preauth need for a bill line via SHA interventions coverage
136
+ * using `cr_no` + `intervention_code` (+ optional `subBenefitCode` from claim visit).
137
+ */
138
+ export async function resolveNormalPreauthForBillItem(
139
+ item: PatientFacilityBillDetails,
140
+ locationUuid: string,
141
+ subBenefitCode?: string,
142
+ ): Promise<ShaInterventionPreauthFlags | null> {
143
+ const code = (item.intervention_code ?? '').trim();
144
+ const patientId = (item.cr_no ?? '').trim();
145
+ if (!code || !patientId || !locationUuid) {
146
+ return null;
147
+ }
148
+ try {
149
+ const intervention = await fetchShaInterventionByCode(
150
+ patientId,
151
+ locationUuid,
152
+ code,
153
+ subBenefitCode,
154
+ );
155
+ if (!intervention) {
156
+ return { needsPreauth: false, needsManualPreauthApproval: false, intervention: null };
157
+ }
158
+ return {
159
+ needsPreauth: Boolean(intervention.needsPreauth),
160
+ needsManualPreauthApproval: Boolean(intervention.needsManualPreauthApproval),
161
+ intervention,
162
+ };
163
+ } catch {
164
+ return null;
165
+ }
166
+ }
167
+
168
+ export async function fetchActiveVisitForPatient(patientUuid: string, locationUuid?: string): Promise<Visit | null> {
169
+ if (!patientUuid) {
170
+ return null;
171
+ }
172
+ const params = new URLSearchParams({
173
+ patient: patientUuid,
174
+ includeInactive: 'false',
175
+ fromStartDate: dayjs().startOf('day').toISOString(),
176
+ v: 'full',
177
+ limit: '1',
178
+ });
179
+ if (locationUuid) {
180
+ params.set('location', locationUuid);
181
+ }
182
+ const response = await openmrsFetch(`${restBaseUrl}/visit?${params.toString()}`);
183
+ const results = response?.data?.results as Visit[] | undefined;
184
+ return results?.[0] ?? null;
185
+ }
186
+
187
+ export async function fetchNormalPreauthBillItems(
188
+ locationUuid: string,
189
+ billingDate: string,
190
+ ): Promise<PatientFacilityBillDetails[]> {
191
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
192
+ // Dedicated `/facility/pre-auth-bills` already returns preauth candidates; still drop
193
+ // elective / already-approved / lines without an intervention code.
194
+ return (results ?? []).filter((item) => {
195
+ if (!item?.intervention_code) return false;
196
+ if (asBool(item.preauth_approved)) return false;
197
+ if (asBool(item.elective_preauth)) return false;
198
+ if (item.requires_preauth != null || item.normal_preauth != null) {
199
+ return needsNormalPreauth(item);
200
+ }
201
+ return true;
202
+ });
203
+ }
204
+
205
+ export async function fetchElectivePreauthBillItems(
206
+ locationUuid: string,
207
+ billingDate: string,
208
+ ): Promise<PatientFacilityBillDetails[]> {
209
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
210
+ return (results ?? []).filter((item) => needsElectivePreauth(item));
211
+ }
212
+
213
+ export async function fetchPreauthBillItems(
214
+ locationUuid: string,
215
+ billingDate: string,
216
+ ): Promise<PatientFacilityBillDetails[]> {
217
+ const results = await fetchFacilityPreauthBills({ locationUuid, billingDate });
218
+ return (results ?? []).filter((item) => {
219
+ if (!item?.intervention_code) return false;
220
+ if (asBool(item.preauth_approved)) return false;
221
+ if (asBool(item.elective_preauth)) return true;
222
+ if (item.requires_preauth != null || item.normal_preauth != null) {
223
+ return needsNormalPreauth(item);
224
+ }
225
+ return true;
226
+ });
227
+ }
228
+
229
+ export function resolveConsentTokenForVisit(visit: Visit | null | undefined): string {
230
+ if (!visit) return '';
231
+ return getConsentToken(visit);
232
+ }
233
+
234
+ export function storePreauthCode(consentToken: string, interventionCode: string, preauthCode: string) {
235
+ try {
236
+ const raw = sessionStorage.getItem(PREAUTH_CODE_KEY);
237
+ const map = raw ? (JSON.parse(raw) as Record<string, string>) : {};
238
+ map[`${consentToken}::${interventionCode}`] = preauthCode;
239
+ sessionStorage.setItem(PREAUTH_CODE_KEY, JSON.stringify(map));
240
+ } catch {
241
+ // ignore
242
+ }
243
+ }
244
+
245
+ export function getStoredPreauthCode(consentToken: string, interventionCode: string): string | undefined {
246
+ try {
247
+ const raw = sessionStorage.getItem(PREAUTH_CODE_KEY);
248
+ if (!raw) return undefined;
249
+ const map = JSON.parse(raw) as Record<string, string>;
250
+ return map[`${consentToken}::${interventionCode}`];
251
+ } catch {
252
+ return undefined;
253
+ }
254
+ }
255
+
256
+ export function parseDocTypes(csv?: string | null): string[] {
257
+ if (!csv) return [];
258
+ return csv
259
+ .split(',')
260
+ .map((s) => s.trim())
261
+ .filter(Boolean);
262
+ }
263
+
264
+ export function interventionFlagsFromBillItem(item: PatientFacilityBillDetails) {
265
+ return {
266
+ code: item.intervention_code,
267
+ ...readSpecialtyFlags(item),
268
+ requiredPreauthDocumentTypes: parseDocTypes(item.required_preauth_document_types),
269
+ applicableDocumentTypes: parseDocTypes(item.applicable_document_types),
270
+ };
271
+ }
272
+
273
+ /** Specialty flags from visit/SHA/bill payloads (snake_case or camelCase). */
274
+ export function readSpecialtyFlags(source: unknown): {
275
+ requiresSurgicalPreauth: boolean;
276
+ requiresRenalPreauth: boolean;
277
+ requiresOncologyPreauth: boolean;
278
+ requiresRadiologyPreauth: boolean;
279
+ requiresOpticalPreauth: boolean;
280
+ } {
281
+ const s = (source ?? {}) as Record<string, unknown>;
282
+ return {
283
+ requiresSurgicalPreauth: asBool(s.requiresSurgicalPreauth ?? s.requires_surgical_preauth),
284
+ requiresRenalPreauth: asBool(s.requiresRenalPreauth ?? s.requires_renal_preauth),
285
+ requiresOncologyPreauth: asBool(s.requiresOncologyPreauth ?? s.requires_oncology_preauth),
286
+ requiresRadiologyPreauth: asBool(s.requiresRadiologyPreauth ?? s.requires_radiology_preauth),
287
+ requiresOpticalPreauth: asBool(s.requiresOpticalPreauth ?? s.requires_optical_preauth),
288
+ };
289
+ }
290
+
291
+ export function mergeSpecialtyFlags(
292
+ ...sources: Array<ReturnType<typeof readSpecialtyFlags> | null | undefined>
293
+ ): ReturnType<typeof readSpecialtyFlags> {
294
+ return sources.reduce(
295
+ (acc, src) => ({
296
+ requiresSurgicalPreauth: acc.requiresSurgicalPreauth || !!src?.requiresSurgicalPreauth,
297
+ requiresRenalPreauth: acc.requiresRenalPreauth || !!src?.requiresRenalPreauth,
298
+ requiresOncologyPreauth: acc.requiresOncologyPreauth || !!src?.requiresOncologyPreauth,
299
+ requiresRadiologyPreauth: acc.requiresRadiologyPreauth || !!src?.requiresRadiologyPreauth,
300
+ requiresOpticalPreauth: acc.requiresOpticalPreauth || !!src?.requiresOpticalPreauth,
301
+ }),
302
+ {
303
+ requiresSurgicalPreauth: false,
304
+ requiresRenalPreauth: false,
305
+ requiresOncologyPreauth: false,
306
+ requiresRadiologyPreauth: false,
307
+ requiresOpticalPreauth: false,
308
+ },
309
+ );
310
+ }
311
+
312
+ export function preauthFormLabel(flags: {
313
+ requiresSurgicalPreauth?: boolean;
314
+ requiresRenalPreauth?: boolean;
315
+ requiresOncologyPreauth?: boolean;
316
+ requiresRadiologyPreauth?: boolean;
317
+ requiresOpticalPreauth?: boolean;
318
+ }): string {
319
+ if (flags.requiresSurgicalPreauth) return 'Surgical';
320
+ if (flags.requiresRenalPreauth) return 'Renal';
321
+ if (flags.requiresOncologyPreauth) return 'Oncology';
322
+ if (flags.requiresRadiologyPreauth) return 'Imaging';
323
+ if (flags.requiresOpticalPreauth) return 'Optical';
324
+ return 'Normal';
325
+ }
326
+
327
+ export type PreauthInterventionProps = {
328
+ code: string;
329
+ name?: string;
330
+ requiresSurgicalPreauth?: boolean;
331
+ requiresRenalPreauth?: boolean;
332
+ requiresOncologyPreauth?: boolean;
333
+ requiresRadiologyPreauth?: boolean;
334
+ requiresOpticalPreauth?: boolean;
335
+ requiredPreauthDocumentTypes?: string[];
336
+ applicableDocumentTypes?: string[];
337
+ };
338
+
339
+ export const GENERATABLE_DOC_TYPES = new Set(['DISCHARGE_SUMMARY', 'INVOICE', 'FINAL_BILL']);
340
+
341
+ export type OpenMrsProviderHit = {
342
+ uuid: string;
343
+ display: string;
344
+ identifier?: string;
345
+ /** From provider attribute type PROVIDER_NATIONAL_ID_UUID (National ID card) */
346
+ nationalId?: string;
347
+ person?: { display?: string; uuid?: string };
348
+ };
349
+
350
+ function extractProviderNationalId(
351
+ attributes?: Array<{ value?: string; voided?: boolean; attributeType?: { uuid?: string } }>,
352
+ ): string | undefined {
353
+ const hit = (attributes ?? []).find(
354
+ (a) => !a.voided && a.attributeType?.uuid === IdentifierTypesUuids.PROVIDER_NATIONAL_ID_UUID && a.value,
355
+ );
356
+ return hit?.value ? String(hit.value).trim() : undefined;
357
+ }
358
+
359
+ export async function searchOpenMrsProviders(q: string): Promise<OpenMrsProviderHit[]> {
360
+ if (!q || q.trim().length < 2) {
361
+ return [];
362
+ }
363
+ const url = `${restBaseUrl}/provider?q=${encodeURIComponent(q.trim())}&v=custom:(uuid,display,identifier,person:(uuid,display),attributes:(uuid,value,voided,attributeType:(uuid)))`;
364
+ const response = await openmrsFetch(url);
365
+ const results = (response?.data?.results as Array<OpenMrsProviderHit & { attributes?: any[] }>) ?? [];
366
+ return results.map((p) => ({
367
+ uuid: p.uuid,
368
+ display: p.display,
369
+ identifier: p.identifier,
370
+ person: p.person,
371
+ nationalId: extractProviderNationalId(p.attributes),
372
+ }));
373
+ }
374
+
375
+ /** ICD-11 concept source used by AMRS / ETL patient diagnosis (claims-and-billing). */
376
+ export const ICD11_CONCEPT_SOURCE_UUID = '43aaca5f-d623-43fd-993b-673b5d927cdd';
377
+
378
+ export type DiagnosisConceptHit = {
379
+ uuid: string;
380
+ display: string;
381
+ icd11Code: string;
382
+ };
383
+
384
+ type ConceptMappingLike = {
385
+ display?: string;
386
+ conceptReferenceTerm?: {
387
+ code?: string;
388
+ name?: string;
389
+ conceptSource?: { uuid?: string; name?: string; hl7Code?: string };
390
+ };
391
+ };
392
+
393
+ function extractIcd11CodeFromConcept(concept: {
394
+ mappings?: ConceptMappingLike[];
395
+ }): string {
396
+ for (const m of concept.mappings ?? []) {
397
+ const term = m.conceptReferenceTerm;
398
+ if (!term) continue;
399
+ const source = term.conceptSource ?? {};
400
+ const sourceUuid = String(source.uuid ?? '');
401
+ const sourceName = String(source.name ?? '').toUpperCase();
402
+ const hl7 = String(source.hl7Code ?? '').toUpperCase();
403
+ if (
404
+ sourceUuid === ICD11_CONCEPT_SOURCE_UUID ||
405
+ sourceName.includes('ICD-11') ||
406
+ sourceName.includes('ICD11') ||
407
+ hl7 === 'ICD11' ||
408
+ hl7.includes('ICD-11')
409
+ ) {
410
+ const code = String(term.code ?? '').trim();
411
+ if (code) return code;
412
+ }
413
+ }
414
+ for (const m of concept.mappings ?? []) {
415
+ const display = String(m.display ?? '');
416
+ if (/ICD-?11/i.test(display)) {
417
+ const code = display.split(':').pop()?.trim();
418
+ if (code) return code;
419
+ }
420
+ }
421
+ return '';
422
+ }
423
+
424
+ /**
425
+ * Search the OpenMRS concept dictionary for ICD-11–mapped diagnosis concepts.
426
+ * Used when the clerk types in Raise Preauth (visit diagnoses still prefill the list).
427
+ */
428
+ export async function searchDiagnosisConcepts(q: string): Promise<DiagnosisConceptHit[]> {
429
+ const term = (q ?? '').trim();
430
+ if (term.length < 2) {
431
+ return [];
432
+ }
433
+ const params = new URLSearchParams({
434
+ q: term,
435
+ limit: '25',
436
+ v: 'custom:(uuid,display,mappings:(display,conceptReferenceTerm:(uuid,code,name,conceptSource:(uuid,name,hl7Code))))',
437
+ });
438
+ const response = await openmrsFetch(`${restBaseUrl}/concept?${params.toString()}`);
439
+ const results = (response?.data?.results as Array<{
440
+ uuid: string;
441
+ display: string;
442
+ mappings?: ConceptMappingLike[];
443
+ }>) ?? [];
444
+
445
+ const hits: DiagnosisConceptHit[] = [];
446
+ const seen = new Set<string>();
447
+ for (const c of results) {
448
+ const icd11Code = extractIcd11CodeFromConcept(c);
449
+ if (!icd11Code) continue;
450
+ const key = `${icd11Code}|${c.uuid}`;
451
+ if (seen.has(key)) continue;
452
+ seen.add(key);
453
+ hits.push({
454
+ uuid: c.uuid,
455
+ display: c.display || icd11Code,
456
+ icd11Code,
457
+ });
458
+ }
459
+ return hits;
460
+ }
461
+
462
+ export type HwrSearchResult = {
463
+ membership?: {
464
+ id?: string;
465
+ full_name?: string;
466
+ registration_id?: string;
467
+ licensing_body?: string;
468
+ specialty?: string;
469
+ status?: string;
470
+ external_reference_id?: string;
471
+ };
472
+ contacts?: { email?: string; phone?: string };
473
+ identifiers?: {
474
+ identification_type?: string;
475
+ identification_number?: string;
476
+ client_registry_id?: string;
477
+ };
478
+ };
479
+
480
+ /** GET {hieBaseUrl}/practitioner/search */
481
+ export async function searchHealthWorkerRegistry(params: {
482
+ identifierType: string;
483
+ identifierValue: string;
484
+ locationUuid: string;
485
+ }): Promise<HwrSearchResult[]> {
486
+ const { getHieBaseUrl } = await import('../../../../claims/utils');
487
+ const { hieBaseUrl } = await getHieBaseUrl();
488
+ const qs = new URLSearchParams({
489
+ identifierType: params.identifierType,
490
+ identifierValue: params.identifierValue,
491
+ locationUuid: params.locationUuid,
492
+ });
493
+ const response = await openmrsFetch(`${hieBaseUrl}/practitioner/search?${qs.toString()}`);
494
+ const data = response?.data;
495
+ if (Array.isArray(data)) {
496
+ // Backend may return HealthWokerApiResponse[] with { message } wrappers
497
+ return data.map((row: any) => row?.message ?? row).filter(Boolean);
498
+ }
499
+ if (data?.message) {
500
+ return [data.message];
501
+ }
502
+ return data ? [data] : [];
503
+ }
504
+
505
+ export function billingDateToVisitDate(billDate?: string): string {
506
+ if (!billDate) {
507
+ return dayjs().format('YYYY-MM-DD');
508
+ }
509
+ // "2026-07-23 12:16" or ISO
510
+ const d = dayjs(billDate);
511
+ return d.isValid() ? d.format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD');
512
+ }
513
+
514
+ /**
515
+ * Load patient facility bill lines and resolve unit_price for the intervention.
516
+ * Handles multiple lines sharing one intervention_code by matching billable_service.
517
+ */
518
+ export async function resolveUnitPriceFromPatientBills(params: {
519
+ patientUuid: string;
520
+ locationUuid: string;
521
+ billingDate?: string;
522
+ interventionCode: string;
523
+ serviceHint?: string | null;
524
+ }): Promise<{ unitPrice: string; billLine: PatientFacilityBillDetails | null }> {
525
+ const patientUuid = (params.patientUuid ?? '').trim();
526
+ const locationUuid = (params.locationUuid ?? '').trim();
527
+ const interventionCode = (params.interventionCode ?? '').trim();
528
+ if (!patientUuid || !locationUuid || !interventionCode) {
529
+ return { unitPrice: '', billLine: null };
530
+ }
531
+ try {
532
+ const billingDate = billingDateToVisitDate(params.billingDate);
533
+ const bills = await fetchPatientFacilityBillDetails({
534
+ patientUuid,
535
+ locationUuid,
536
+ billingDate,
537
+ });
538
+ const line = pickBillLineForIntervention(bills ?? [], interventionCode, params.serviceHint);
539
+ return { unitPrice: unitPriceFromBillLine(line), billLine: line };
540
+ } catch {
541
+ return { unitPrice: '', billLine: null };
542
+ }
543
+ }
544
+
545
+ /** Build service_start/service_end ISO. `timeOrEndOfDay` may be "HH:mm" / "HH:mm:ss", or true for end-of-day. */
546
+ export function dateToServiceIso(date: Date | undefined, timeOrEndOfDay: string | boolean = false): string {
547
+ if (!date || Number.isNaN(date.getTime())) {
548
+ return dayjs().format('YYYY-MM-DDTHH:mm:ssZ');
549
+ }
550
+ if (typeof timeOrEndOfDay === 'string') {
551
+ const parts = timeOrEndOfDay.split(':').map((p) => Number(p));
552
+ const [h = 0, m = 0, s = 0] = parts;
553
+ return dayjs(date).hour(h).minute(m).second(s).format('YYYY-MM-DDTHH:mm:ssZ');
554
+ }
555
+ const d = timeOrEndOfDay
556
+ ? dayjs(date).hour(23).minute(59).second(0)
557
+ : dayjs(date).hour(8).minute(0).second(0);
558
+ return d.format('YYYY-MM-DDTHH:mm:ssZ');
559
+ }
560
+
561
+ /** POC Pre-authorization Form encounter type. */
562
+ export const PREAUTH_FORM_UUID = 'cce578f6-b3e2-3077-91ab-9016cf0f4fa5';
563
+ export const PREAUTH_ENCOUNTER_TYPE_UUID = '18b10189-a89f-430d-83e9-14663fef258c';
564
+
565
+ /** Clinical notes / indications concept — same UUID as admissions clinical notes. */
566
+ export const CLINICAL_INDICATIONS_CONCEPT_UUID = '5e4dc798-2cce-4a1a-97e9-bcf22d64b07c';
567
+
568
+ export const PREAUTH_FORM_CONCEPTS = {
569
+ typeOfIntervention: 'aea44bfb-c8b1-4cce-b891-af74181d0f57',
570
+ clinicalIndication: CLINICAL_INDICATIONS_CONCEPT_UUID,
571
+ startDate: 'bb85532e-8f7e-476f-81d7-5580e0385852',
572
+ /** Same concept as startDate — stores elective expected service start on the preauth encounter. */
573
+ expectedServiceStartDate: 'bb85532e-8f7e-476f-81d7-5580e0385852',
574
+ sessionNumber: '86f4e2e2-c2e8-4d0b-9ed7-34900d55ae09',
575
+ frequencyOfSessions: 'a40396d3-3f9b-49b6-902a-a804f3d0e2a0',
576
+ clinicalIndicationRenal: '85b45e49-2428-4898-b9f8-62a1b8a4b4e4',
577
+ newRequest: 'aad64a84-1a63-47e3-a806-fb704b52b709',
578
+ lens: 'f0e18a8e-5912-4b5b-aae0-6f83b5de77af',
579
+ eyeExaminationAmount: 'a04a2d91-e540-45d4-a650-70bf4cab0b3f',
580
+ frameAmount: '424b5c35-f37f-4ec7-8b4a-a64c34c5f5ef',
581
+ lensAmount: '2dfe99ac-b32b-4cb9-b6e7-8e557a43624b',
582
+ complaintGroup: '9014962e-3efe-46b0-a393-c8c8bddadaa7',
583
+ complaint: 'a8a6ddb6-1350-11df-a1f1-0026b9348838',
584
+ otherComplaint: 'a8a06fc6-1350-11df-a1f1-0026b9348838',
585
+ hpi: '9e903280-385f-473d-9dfb-01bdb6b661a5',
586
+ generalExam: 'a8a0cc32-1350-11df-a1f1-0026b9348838',
587
+ investigation: '7b64016c-ae2d-4ec1-bdc1-e920b0e94b9d',
588
+ anaesthesia: '2ea4944e-51e4-52c7-a209-8dcc2e889054',
589
+ employmentRelated: '7dcf0456-a9ec-42d3-aa75-d406d3e5abb1',
590
+ accidentRelated: '855b3a01-53c9-4129-923d-79863d318580',
591
+ coInsured: '415dbca0-2d9b-4d6a-98b7-b855a023cbbb',
592
+ coInsuredDetails: '226c4f3a-3db3-4244-adc3-bc224b90d8fe',
593
+ doctor: 'a8a8c96e-1350-11df-a1f1-0026b9348838',
594
+ yes: 'a899b35c-1350-11df-a1f1-0026b9348838',
595
+ no: 'a899b42e-1350-11df-a1f1-0026b9348838',
596
+ other: 'a8aaf3e2-1350-11df-a1f1-0026b9348838',
597
+ /**
598
+ * Text obs that stores the planned orderable concept UUID (elective capture / edit).
599
+ * Override via electivePreauth.plannedServiceObsConceptUuid if this UUID is not in your dictionary.
600
+ */
601
+ plannedServiceConcept: 'c0ffee00-e1e2-4a3b-9c0d-e1e2e3e4e5e6',
602
+ } as const;
603
+
604
+ /** Coded answers for `typeOfIntervention`. */
605
+ export const PREAUTH_INTERVENTION_TYPE = {
606
+ surgical: '63c079d9-87fb-4bea-b860-863bff0e29c5',
607
+ renal: '597896cd-2841-42e9-8fb0-4292f82ac7b6',
608
+ normal: 'a8a09ac8-1350-11df-a1f1-0026b9348838',
609
+ imaging: '5771e408-a5e5-402b-9f29-b76106dfc71a',
610
+ optical: 'a8a06788-1350-11df-a1f1-0026b9348838',
611
+ oncology: '073ea366-834b-49bd-b4db-ce4e6c61bbc3',
612
+ } as const;
613
+
614
+ const FREQUENCY_CONCEPT_TO_HIE: Record<string, string> = {
615
+ // Confirmed from live PREAUTHORIZATION encounter (ONCE A WEEK)
616
+ '5dcfe297-2ef7-4f1c-97e3-a519c18fcc84': 'ONCE_A_WEEK',
617
+ '690b2ab2-4cbc-4df4-be19-64b8a93981ab': 'ONCE_EVERY_2_WEEKS',
618
+ '72ec1de0-4bf0-4c40-9329-b8f574a64132': 'ONCE_EVERY_3_WEEKS',
619
+ 'a899d7f6-1350-11df-a1f1-0026b9348838': 'ONCE_A_MONTH',
620
+ };
621
+
622
+ function mapFrequencyFromObs(obs: Record<string, unknown> | undefined): string {
623
+ if (!obs) return '';
624
+ const uuid = codedUuid(obs.value);
625
+ if (uuid && FREQUENCY_CONCEPT_TO_HIE[uuid]) {
626
+ return FREQUENCY_CONCEPT_TO_HIE[uuid];
627
+ }
628
+ // Fallback when form schema used placeholder UUIDs but display names are correct
629
+ const display = codedDisplay(obs.value).toUpperCase().replace(/\s+/g, ' ');
630
+ if (!display) return '';
631
+ if (display.includes('TWICE') && display.includes('WEEK')) return 'TWICE_A_WEEK';
632
+ if (
633
+ (display.includes('ONCE') || display.includes('ONE TIME') || display.includes('EVERY')) &&
634
+ display.includes('WEEK') &&
635
+ !display.includes('2') &&
636
+ !display.includes('3')
637
+ ) {
638
+ return 'ONCE_A_WEEK';
639
+ }
640
+ if (display.includes('2 WEEK') || display.includes('EVERY 2')) return 'ONCE_EVERY_2_WEEKS';
641
+ if (display.includes('3 WEEK') || display.includes('EVERY 3')) return 'ONCE_EVERY_3_WEEKS';
642
+ if (display.includes('MONTH')) return 'ONCE_A_MONTH';
643
+ return '';
644
+ }
645
+
646
+ const ANAESTHESIA_CONCEPT_TO_HIE: Record<string, string> = {
647
+ '7a69a31a-d88f-4ebd-a00b-cb5b4581de00': 'GENERAL',
648
+ '074225d4-b1be-56e9-93f6-255ebf106df3': 'LOCAL',
649
+ '3fa5c3a8-41e5-493a-9ab7-7177fc6f8c82': 'SEDATION',
650
+ 'f45ac884-e73e-4b02-9d8b-49c4e3ce5a15': 'SPINAL',
651
+ };
652
+
653
+ /** Complaint coded answers from POC Pre-authorization Form → display labels. */
654
+ const COMPLAINT_CONCEPT_TO_LABEL: Record<string, string> = {
655
+ 'a8932f00-1350-11df-a1f1-0026b9348838': 'Abdominal pain',
656
+ 'a0bda074-8e57-4ba7-ab9c-c008776f8d48': 'Abnormal uterine bleeding',
657
+ 'a89cec02-1350-11df-a1f1-0026b9348838': 'Anxiety',
658
+ 'a8953d90-1350-11df-a1f1-0026b9348838': 'Back pain',
659
+ 'a8981696-1350-11df-a1f1-0026b9348838': 'Bloody urine',
660
+ 'bb1637fd-dd30-4938-a7a7-30dcef155f38': 'Blood in stool',
661
+ 'c7356bfe-e9a8-422b-9a6a-6e42490d308e': 'Breast pain',
662
+ 'a892e4b4-1350-11df-a1f1-0026b9348838': 'Chest pain',
663
+ 'a898314e-1350-11df-a1f1-0026b9348838': 'Cold and chills',
664
+ 'a8ad3b02-1350-11df-a1f1-0026b9348838': 'Confusion',
665
+ 'a890d73c-1350-11df-a1f1-0026b9348838': 'Cough',
666
+ 'b9655bbd-a94f-41a6-a5c6-4ea9ed83e840': 'Convulsions',
667
+ '894e909e-881c-4ac3-b669-4c77003831ad': 'Coma',
668
+ 'a890d660-1350-11df-a1f1-0026b9348838': 'Coryza',
669
+ '96dafdc7-720e-4eac-85d3-ae2a0f5c1d94': 'Crying infant',
670
+ 'a58cfd5c-a237-46fd-b0fc-bb7f2192bb69': 'Delirium',
671
+ 'a8935fde-1350-11df-a1f1-0026b9348838': 'Depression',
672
+ 'a890861a-1350-11df-a1f1-0026b9348838': 'Diarrhoea',
673
+ 'a8a454d8-1350-11df-a1f1-0026b9348838': 'Difficult in breathing',
674
+ 'a8983cc0-1350-11df-a1f1-0026b9348838': 'Difficulty in swallowing',
675
+ 'abb19bab-e77d-47db-b9b6-18386868e1b3': 'Discharge from penis',
676
+ 'e5c11905-baf7-4747-a01d-0525153e143a': 'Dizziness',
677
+ 'eb12bfd6-dd52-4c41-a35e-a8048c975e7f': 'Ear Pain',
678
+ '9a9cb2d4-696c-4f2b-9a7b-206333597e3c': 'Epigastric pain',
679
+ '05354fc6-fd53-4c40-9379-ba2b4457635e': 'Eye pain',
680
+ 'd301ff85-d21c-4a61-a195-ce7948db423c': 'Excessive sweating',
681
+ '4a3fa87f-0f09-4b70-bfaf-ed9cba1f9aa7': 'Facial pain',
682
+ '4b92fa43-a876-4fee-886b-ce4fc2e18512': 'Fatigue/weakness',
683
+ 'cebb22fc-5ef8-409e-b606-51fdb7039593': 'Flank pain',
684
+ 'a8ad0038-1350-11df-a1f1-0026b9348838': 'Fever',
685
+ '8065a17b-fbe4-4558-9ddd-0af641866c21': 'General body malaise',
686
+ '4eef684c-feff-48bb-9e8e-fe5742bee979': 'Genital ulcer',
687
+ 'a8966d1e-1350-11df-a1f1-0026b9348838': 'Headache',
688
+ '13a3c07c-e870-4cc9-b7d3-d2e5b5e60a3e': 'Hearing loss',
689
+ 'a89d1222-1350-11df-a1f1-0026b9348838': 'Hypotension',
690
+ 'a8983ae0-1350-11df-a1f1-0026b9348838': 'Itchiness/Pruritus',
691
+ 'a890ba5e-1350-11df-a1f1-0026b9348838': 'Joint pain',
692
+ 'be9da369-ba93-4a0c-afdd-616ed4b434e8': 'Leg pain',
693
+ 'a8ad042a-1350-11df-a1f1-0026b9348838': 'Lethargy',
694
+ 'a8982eba-1350-11df-a1f1-0026b9348838': 'Loss of appetite',
695
+ 'a893378e-1350-11df-a1f1-0026b9348838': 'Lymphadenopathy',
696
+ '5d91ee3c-9ace-462f-97c1-bd0c8fcf8a5e': 'Memory loss',
697
+ '6fac98a0-6d8a-4441-aeed-c447a3a12494': 'Mouth ulceration',
698
+ '02dc5deb-44d1-43db-b65e-9eb0d6cedaaf': 'Mouth pain',
699
+ '1fbf7fd4-ea3e-4ab1-acd9-bf215651e066': 'Muscle cramps',
700
+ 'a8ad5330-1350-11df-a1f1-0026b9348838': 'Muscle pain',
701
+ 'a890e2f4-1350-11df-a1f1-0026b9348838': 'Mylagia',
702
+ 'a8ad21e4-1350-11df-a1f1-0026b9348838': 'Nausea',
703
+ 'a8a6b476-1350-11df-a1f1-0026b9348838': 'Neck stiffness',
704
+ 'bb7fc04f-13d8-4630-b9d8-e364b34b7f2f': 'Neck pain',
705
+ 'a8ad4ed0-1350-11df-a1f1-0026b9348838': 'Night sweats',
706
+ '4ef1a2d0-132d-4a02-b0e0-00890b916343': 'Numbness',
707
+ 'a8a498ee-1350-11df-a1f1-0026b9348838': 'Unexplained bleeding',
708
+ 'd4abb20f-fde4-453b-b7e8-ac35debe83c2': 'Pelvic pain',
709
+ 'a8ad09ca-1350-11df-a1f1-0026b9348838': 'Poor vision',
710
+ 'a895776a-1350-11df-a1f1-0026b9348838': 'Rash',
711
+ '0df011cb-3ff1-465e-ae84-718da974aedd': 'Red Eye/ conjuctivitis',
712
+ 'a8ad4476-1350-11df-a1f1-0026b9348838': 'Refusal to feed',
713
+ 'a8983bda-1350-11df-a1f1-0026b9348838': 'Running/Blocked nose',
714
+ '773bfb25-09c8-4920-89f5-5bdafe5b5b62': 'Scrotal pain',
715
+ 'a8935f0c-1350-11df-a1f1-0026b9348838': 'Seizure',
716
+ '4fd5f4cf-67cd-444d-8f18-a01afb4d9af0': 'Shoulder pain',
717
+ '8ccbbecf-58cd-43c2-ae9a-a36a4e578b25': 'Shock',
718
+ 'a8932d66-1350-11df-a1f1-0026b9348838': 'Sore throat',
719
+ '34c96419-d4a9-4377-8c80-3a31d0f07d13': 'Sleep disturbance',
720
+ 'e01c7959-551c-4c40-bcbf-52ef3087cbff': 'Swollen legs',
721
+ 'ae5f2fc7-3f76-4fc3-96fa-72b354323821': 'Tremors',
722
+ '0ca4d1dc-34df-4ec0-bf2f-0280005ce6c9': 'Urinary symptoms',
723
+ '9abe711c-5e02-4aca-8d70-8b2148a17256': 'Watery diarrhoea',
724
+ 'c982b4fe-8403-4c67-9650-91da17aecf5e': 'Weakness of limbs',
725
+ 'a89807f0-1350-11df-a1f1-0026b9348838': 'Weight loss',
726
+ 'a89d145c-1350-11df-a1f1-0026b9348838': 'Vaginal bleeding',
727
+ 'a8ad2eb4-1350-11df-a1f1-0026b9348838': 'Vaginal discharge',
728
+ 'a8ad239c-1350-11df-a1f1-0026b9348838': 'Vomiting',
729
+ '6d140ca3-118d-48ca-9d91-7b5612987413': 'Vertigo',
730
+ 'a8aaf3e2-1350-11df-a1f1-0026b9348838': 'Other',
731
+ };
732
+
733
+ export type PreauthFormFieldKey =
734
+ | 'clinicalIndications'
735
+ | 'startDate'
736
+ | 'expectedServiceStartDate'
737
+ | 'sessionsRequired'
738
+ | 'frequency'
739
+ | 'chiefComplaint'
740
+ | 'hpi'
741
+ | 'physicalExam'
742
+ | 'investigations'
743
+ | 'anaesthesia'
744
+ | 'surgeryDate'
745
+ | 'relatedToEmployment'
746
+ | 'relatedToAccident'
747
+ | 'isCoInsured'
748
+ | 'coInsuranceDetails';
749
+
750
+ export type PreauthFormValues = {
751
+ clinicalIndications: string;
752
+ startDate: string;
753
+ /** Elective expected service start — same obs concept as startDate on the POC form. */
754
+ expectedServiceStartDate: string;
755
+ sessionsRequired: string;
756
+ frequency: string;
757
+ chiefComplaint: string;
758
+ hpi: string;
759
+ physicalExam: string;
760
+ investigations: string;
761
+ anaesthesia: string;
762
+ surgeryDate: string;
763
+ relatedToEmployment: boolean | null;
764
+ relatedToAccident: boolean | null;
765
+ isCoInsured: boolean | null;
766
+ coInsuranceDetails: string;
767
+ /** Keys that had a real value from the form / obs. */
768
+ found: Set<PreauthFormFieldKey>;
769
+ source: 'encounter' | 'obs' | 'none';
770
+ };
771
+
772
+ function emptyPreauthFormValues(source: PreauthFormValues['source'] = 'none'): PreauthFormValues {
773
+ return {
774
+ clinicalIndications: '',
775
+ startDate: '',
776
+ expectedServiceStartDate: '',
777
+ sessionsRequired: '',
778
+ frequency: '',
779
+ chiefComplaint: '',
780
+ hpi: '',
781
+ physicalExam: '',
782
+ investigations: '',
783
+ anaesthesia: '',
784
+ surgeryDate: '',
785
+ relatedToEmployment: null,
786
+ relatedToAccident: null,
787
+ isCoInsured: null,
788
+ coInsuranceDetails: '',
789
+ found: new Set(),
790
+ source,
791
+ };
792
+ }
793
+
794
+ function conceptUuidOf(obs: Record<string, unknown>): string {
795
+ const c = obs.concept;
796
+ if (typeof c === 'string') return c;
797
+ if (c && typeof c === 'object' && 'uuid' in c) return String((c as { uuid: string }).uuid ?? '');
798
+ return '';
799
+ }
800
+
801
+ function codedUuid(value: unknown): string {
802
+ if (!value) return '';
803
+ if (typeof value === 'string') return value;
804
+ if (typeof value === 'object' && value !== null && 'uuid' in value) {
805
+ return String((value as { uuid: string }).uuid ?? '');
806
+ }
807
+ return '';
808
+ }
809
+
810
+ function codedDisplay(value: unknown): string {
811
+ if (!value || typeof value !== 'object') return '';
812
+ const v = value as { display?: string; name?: { display?: string } };
813
+ return String(v.display ?? v.name?.display ?? '').trim();
814
+ }
815
+
816
+ function obsTextValue(obs: Record<string, unknown> | null | undefined): string {
817
+ if (!obs) return '';
818
+ if (typeof obs.valueText === 'string' && obs.valueText.trim()) {
819
+ return obs.valueText.trim();
820
+ }
821
+ const value = obs.value;
822
+ if (typeof value === 'string' && value.trim()) {
823
+ return value.trim();
824
+ }
825
+ if (typeof value === 'number' && Number.isFinite(value)) {
826
+ return String(value);
827
+ }
828
+ return '';
829
+ }
830
+
831
+ function obsNumericValue(obs: Record<string, unknown> | null | undefined): string {
832
+ if (!obs) return '';
833
+ const value = obs.value;
834
+ if (typeof value === 'number' && Number.isFinite(value)) return String(value);
835
+ if (typeof value === 'string' && value.trim() && !Number.isNaN(Number(value))) return value.trim();
836
+ return obsTextValue(obs);
837
+ }
838
+
839
+ function obsDateIso(obs: Record<string, unknown> | null | undefined): string {
840
+ if (!obs) return '';
841
+ const raw =
842
+ (typeof obs.valueDate === 'string' && obs.valueDate) ||
843
+ (typeof obs.valueDatetime === 'string' && obs.valueDatetime) ||
844
+ (typeof obs.value === 'string' && obs.value) ||
845
+ '';
846
+ const d = dayjs(raw);
847
+ return d.isValid() ? d.format('YYYY-MM-DDTHH:mm:ssZ') : '';
848
+ }
849
+
850
+ function obsYesNo(obs: Record<string, unknown> | null | undefined): boolean | null {
851
+ if (!obs) return null;
852
+ const uuid = codedUuid(obs.value);
853
+ if (uuid === PREAUTH_FORM_CONCEPTS.yes) return true;
854
+ if (uuid === PREAUTH_FORM_CONCEPTS.no) return false;
855
+ return null;
856
+ }
857
+
858
+ function flattenObs(obsList: unknown[]): Record<string, unknown>[] {
859
+ const out: Record<string, unknown>[] = [];
860
+ for (const item of obsList ?? []) {
861
+ if (!item || typeof item !== 'object') continue;
862
+ const obs = item as Record<string, unknown>;
863
+ out.push(obs);
864
+ const groupMembers = obs.groupMembers ?? obs.group_members;
865
+ if (Array.isArray(groupMembers)) {
866
+ out.push(...flattenObs(groupMembers));
867
+ }
868
+ }
869
+ return out;
870
+ }
871
+
872
+ function latestObsByConcept(obsList: Record<string, unknown>[]): Map<string, Record<string, unknown>> {
873
+ const map = new Map<string, Record<string, unknown>>();
874
+ const sorted = [...obsList].sort((a, b) => {
875
+ const ta = dayjs(String(a.obsDatetime ?? '')).valueOf() || 0;
876
+ const tb = dayjs(String(b.obsDatetime ?? '')).valueOf() || 0;
877
+ return tb - ta;
878
+ });
879
+ for (const obs of sorted) {
880
+ const cu = conceptUuidOf(obs);
881
+ if (cu && !map.has(cu)) {
882
+ map.set(cu, obs);
883
+ }
884
+ }
885
+ return map;
886
+ }
887
+
888
+ function markFound(values: PreauthFormValues, key: PreauthFormFieldKey, present: boolean) {
889
+ if (present) values.found.add(key);
890
+ }
891
+
892
+ function mapObsToPreauthFormValues(
893
+ obsList: Record<string, unknown>[],
894
+ source: PreauthFormValues['source'],
895
+ surgeryDateFromEncounter?: string,
896
+ ): PreauthFormValues {
897
+ const values = emptyPreauthFormValues(source);
898
+ const byConcept = latestObsByConcept(obsList);
899
+ const C = PREAUTH_FORM_CONCEPTS;
900
+
901
+ const clinical = obsTextValue(byConcept.get(C.clinicalIndication));
902
+ values.clinicalIndications = clinical;
903
+ markFound(values, 'clinicalIndications', Boolean(clinical));
904
+
905
+ const start = obsDateIso(byConcept.get(C.startDate));
906
+ values.startDate = start;
907
+ markFound(values, 'startDate', Boolean(start));
908
+ // Elective expected service start is stored on the same POC form date concept.
909
+ values.expectedServiceStartDate = start;
910
+ markFound(values, 'expectedServiceStartDate', Boolean(start));
911
+
912
+ const sessions = obsNumericValue(byConcept.get(C.sessionNumber));
913
+ values.sessionsRequired = sessions;
914
+ // Keep "0" as a valid found value (Boolean("0") is true; avoid treating empty only).
915
+ markFound(values, 'sessionsRequired', sessions !== '');
916
+
917
+ const freqObs = byConcept.get(C.frequencyOfSessions);
918
+ const frequency = mapFrequencyFromObs(freqObs);
919
+ values.frequency = frequency;
920
+ markFound(values, 'frequency', Boolean(frequency));
921
+
922
+ const complaints: string[] = [];
923
+ for (const obs of obsList) {
924
+ if (conceptUuidOf(obs) !== C.complaint) continue;
925
+ const uuid = codedUuid(obs.value);
926
+ const label =
927
+ COMPLAINT_CONCEPT_TO_LABEL[uuid] || codedDisplay(obs.value) || obsTextValue(obs);
928
+ if (label) complaints.push(label);
929
+ }
930
+ for (const obs of obsList) {
931
+ if (conceptUuidOf(obs) !== C.otherComplaint) continue;
932
+ const other = obsTextValue(obs);
933
+ if (other) complaints.push(other);
934
+ }
935
+ values.chiefComplaint = [...new Set(complaints)].join('; ');
936
+ markFound(values, 'chiefComplaint', Boolean(values.chiefComplaint));
937
+
938
+ const hpi = obsTextValue(byConcept.get(C.hpi));
939
+ values.hpi = hpi;
940
+ markFound(values, 'hpi', Boolean(hpi));
941
+
942
+ const exam = obsTextValue(byConcept.get(C.generalExam));
943
+ values.physicalExam = exam;
944
+ markFound(values, 'physicalExam', Boolean(exam));
945
+
946
+ const inv = obsTextValue(byConcept.get(C.investigation));
947
+ values.investigations = inv;
948
+ markFound(values, 'investigations', Boolean(inv));
949
+
950
+ const anaObs = byConcept.get(C.anaesthesia);
951
+ const anaUuid = codedUuid(anaObs?.value);
952
+ const anaesthesia = ANAESTHESIA_CONCEPT_TO_HIE[anaUuid] ?? '';
953
+ values.anaesthesia = anaesthesia;
954
+ markFound(values, 'anaesthesia', Boolean(anaesthesia));
955
+
956
+ if (surgeryDateFromEncounter) {
957
+ values.surgeryDate = surgeryDateFromEncounter;
958
+ markFound(values, 'surgeryDate', true);
959
+ }
960
+
961
+ const emp = obsYesNo(byConcept.get(C.employmentRelated));
962
+ values.relatedToEmployment = emp;
963
+ markFound(values, 'relatedToEmployment', emp !== null);
964
+
965
+ const acc = obsYesNo(byConcept.get(C.accidentRelated));
966
+ values.relatedToAccident = acc;
967
+ markFound(values, 'relatedToAccident', acc !== null);
968
+
969
+ const co = obsYesNo(byConcept.get(C.coInsured));
970
+ values.isCoInsured = co;
971
+ markFound(values, 'isCoInsured', co !== null);
972
+
973
+ const coDetails = obsTextValue(byConcept.get(C.coInsuredDetails));
974
+ values.coInsuranceDetails = coDetails;
975
+ markFound(values, 'coInsuranceDetails', Boolean(coDetails));
976
+
977
+ return values;
978
+ }
979
+
980
+ async function fetchLatestObsForConcept(
981
+ patientUuid: string,
982
+ conceptUuid: string,
983
+ ): Promise<Record<string, unknown>[]> {
984
+ try {
985
+ const qs = new URLSearchParams({
986
+ patient: patientUuid,
987
+ concept: conceptUuid,
988
+ v: 'custom:(uuid,obsDatetime,concept:(uuid),value,valueText,valueDate,valueDatetime,groupMembers:(uuid,obsDatetime,concept:(uuid),value,valueText))',
989
+ limit: '50',
990
+ });
991
+ const res = await openmrsFetch(`${restBaseUrl}/obs?${qs.toString()}`);
992
+ return (res?.data?.results ?? []) as Record<string, unknown>[];
993
+ } catch {
994
+ return [];
995
+ }
996
+ }
997
+
998
+ async function fetchLatestPreauthEncounter(patientUuid: string): Promise<Record<string, unknown> | null> {
999
+ try {
1000
+ const qs = new URLSearchParams({
1001
+ patient: patientUuid,
1002
+ encounterType: PREAUTH_ENCOUNTER_TYPE_UUID,
1003
+ v: 'full',
1004
+ limit: '20',
1005
+ });
1006
+ const res = await openmrsFetch(`${restBaseUrl}/encounter?${qs.toString()}`);
1007
+ const results = (res?.data?.results ?? []) as Record<string, unknown>[];
1008
+ if (!results.length) return null;
1009
+ const sorted = [...results].sort((a, b) => {
1010
+ const ta = dayjs(String(a.encounterDatetime ?? '')).valueOf() || 0;
1011
+ const tb = dayjs(String(b.encounterDatetime ?? '')).valueOf() || 0;
1012
+ return tb - ta;
1013
+ });
1014
+ let encounter = sorted[0] ?? null;
1015
+ if (!encounter) return null;
1016
+
1017
+ // List endpoints sometimes omit nested obs even with v=full — reload by uuid.
1018
+ const obs = encounter.obs;
1019
+ if (!Array.isArray(obs) || obs.length === 0) {
1020
+ const id = String(encounter.uuid ?? '');
1021
+ if (id) {
1022
+ try {
1023
+ const full = await openmrsFetch(`${restBaseUrl}/encounter/${id}?v=full`);
1024
+ if (full?.data && typeof full.data === 'object') {
1025
+ encounter = full.data as Record<string, unknown>;
1026
+ }
1027
+ } catch {
1028
+ // keep list representation
1029
+ }
1030
+ }
1031
+ }
1032
+ return encounter;
1033
+ } catch {
1034
+ return null;
1035
+ }
1036
+ }
1037
+
1038
+ /**
1039
+ * Prefill values from POC Pre-authorization Form:
1040
+ * 1) specific encounter when encounterUuid is provided (elective hold Raise)
1041
+ * 2) else latest PREAUTHORIZATION encounter obs
1042
+ * 3) else latest obs per concept
1043
+ */
1044
+ export async function fetchPreauthFormValues(
1045
+ patientUuid: string,
1046
+ encounterUuid?: string,
1047
+ ): Promise<PreauthFormValues> {
1048
+ const uuid = (patientUuid ?? '').trim();
1049
+ if (!uuid) return emptyPreauthFormValues('none');
1050
+
1051
+ const encounterId = (encounterUuid ?? '').trim();
1052
+ let encounter: Record<string, unknown> | null = null;
1053
+ if (encounterId) {
1054
+ try {
1055
+ const full = await openmrsFetch(`${restBaseUrl}/encounter/${encounterId}?v=full`);
1056
+ if (full?.data && typeof full.data === 'object') {
1057
+ encounter = full.data as Record<string, unknown>;
1058
+ }
1059
+ } catch {
1060
+ encounter = null;
1061
+ }
1062
+ }
1063
+ if (!encounter) {
1064
+ encounter = await fetchLatestPreauthEncounter(uuid);
1065
+ }
1066
+ if (encounter) {
1067
+ const obs = flattenObs(Array.isArray(encounter.obs) ? encounter.obs : []);
1068
+ const surgeryRaw = String(encounter.encounterDatetime ?? '');
1069
+ const surgeryDate = dayjs(surgeryRaw).isValid()
1070
+ ? dayjs(surgeryRaw).format('YYYY-MM-DDTHH:mm:ssZ')
1071
+ : '';
1072
+ const fromEncounter = mapObsToPreauthFormValues(obs, 'encounter', surgeryDate);
1073
+ // When a specific encounter was requested (elective), return that mapping even if empty —
1074
+ // do not fall back to unrelated latest obs. Normal preauth (no encounterId) still falls
1075
+ // through to per-concept latest when the latest encounter has no mappable obs.
1076
+ if (fromEncounter.found.size > 0 || encounterId) {
1077
+ return fromEncounter;
1078
+ }
1079
+ // Encounter present but no mappable obs — fall through to per-concept latest
1080
+ }
1081
+
1082
+ const conceptList = [
1083
+ PREAUTH_FORM_CONCEPTS.clinicalIndication,
1084
+ PREAUTH_FORM_CONCEPTS.startDate,
1085
+ PREAUTH_FORM_CONCEPTS.sessionNumber,
1086
+ PREAUTH_FORM_CONCEPTS.frequencyOfSessions,
1087
+ PREAUTH_FORM_CONCEPTS.complaintGroup,
1088
+ PREAUTH_FORM_CONCEPTS.complaint,
1089
+ PREAUTH_FORM_CONCEPTS.otherComplaint,
1090
+ PREAUTH_FORM_CONCEPTS.hpi,
1091
+ PREAUTH_FORM_CONCEPTS.generalExam,
1092
+ PREAUTH_FORM_CONCEPTS.investigation,
1093
+ PREAUTH_FORM_CONCEPTS.anaesthesia,
1094
+ PREAUTH_FORM_CONCEPTS.employmentRelated,
1095
+ PREAUTH_FORM_CONCEPTS.accidentRelated,
1096
+ PREAUTH_FORM_CONCEPTS.coInsured,
1097
+ PREAUTH_FORM_CONCEPTS.coInsuredDetails,
1098
+ ];
1099
+
1100
+ const batches = await Promise.all(conceptList.map((c) => fetchLatestObsForConcept(uuid, c)));
1101
+ const allObs = flattenObs(batches.flat());
1102
+ if (!allObs.length) return emptyPreauthFormValues(encounter ? 'encounter' : 'none');
1103
+ return mapObsToPreauthFormValues(allObs, 'obs');
1104
+ }
1105
+
1106
+ /**
1107
+ * Latest OpenMRS obs for the clinical-indications concept for a patient.
1108
+ * Soft-fails to '' if missing or the request errors.
1109
+ */
1110
+ export async function fetchLatestClinicalIndicationsObs(patientUuid: string): Promise<string> {
1111
+ const values = await fetchPreauthFormValues(patientUuid);
1112
+ return values.clinicalIndications;
1113
+ }
1114
+
1115
+ export type PreauthBillableService = {
1116
+ uuid: string;
1117
+ name: string;
1118
+ shortName?: string;
1119
+ serviceStatus?: string;
1120
+ serviceType?: { uuid?: string; display?: string };
1121
+ servicePrices?: Array<{
1122
+ uuid?: string;
1123
+ name?: string;
1124
+ price?: number;
1125
+ paymentMode?: { uuid?: string; name?: string };
1126
+ }>;
1127
+ concept?: { uuid?: string };
1128
+ };
1129
+
1130
+ const PREAUTH_BILLABLE_PAGE_SIZE = 500; // OpenMRS REST absolute max on this server
1131
+ const PREAUTH_BILLABLE_REPRESENTATION =
1132
+ 'custom:(uuid,name,shortName,serviceStatus,serviceType:(uuid,display),servicePrices:(uuid,name,price,paymentMode),concept:(uuid))';
1133
+
1134
+ /**
1135
+ * Fetches the full billable-service catalog in pages of ≤500
1136
+ * (server rejects higher limits with "absolute limit at 500").
1137
+ */
1138
+ async function fetchAllPreauthBillableServices(): Promise<PreauthBillableService[]> {
1139
+ const all: PreauthBillableService[] = [];
1140
+ let startIndex = 0;
1141
+
1142
+ for (;;) {
1143
+ const url =
1144
+ `${restBaseUrl}/billing/billableService?v=${PREAUTH_BILLABLE_REPRESENTATION}` +
1145
+ `&limit=${PREAUTH_BILLABLE_PAGE_SIZE}&startIndex=${startIndex}`;
1146
+ const { data } = await openmrsFetch<{ results: PreauthBillableService[] }>(url);
1147
+ const page = data?.results ?? [];
1148
+ all.push(...page);
1149
+ if (page.length < PREAUTH_BILLABLE_PAGE_SIZE) {
1150
+ break;
1151
+ }
1152
+ startIndex += PREAUTH_BILLABLE_PAGE_SIZE;
1153
+ }
1154
+
1155
+ return all;
1156
+ }
1157
+
1158
+ /**
1159
+ * Billable-service catalog for the Raise preauth form only.
1160
+ * Kept separate from create-order `useBillableItems` so limit / filtering
1161
+ * changes here do not affect billing or switch-intervention workspaces.
1162
+ */
1163
+ export function usePreauthBillableServices() {
1164
+ const { data, isLoading, error } = useSWR('preauth-billable-services', fetchAllPreauthBillableServices);
1165
+ const [searchTerm, setSearchTerm] = useState('');
1166
+ const q = searchTerm.trim().toLowerCase();
1167
+ const lineItems = (data ?? []).filter((item) =>
1168
+ String(item?.name ?? '')
1169
+ .toLowerCase()
1170
+ .includes(q),
1171
+ );
1172
+
1173
+ return {
1174
+ lineItems,
1175
+ isLoading,
1176
+ error,
1177
+ searchTerm,
1178
+ setSearchTerm,
1179
+ };
1180
+ }
1181
+
1182
+ /** Reusable preauth status check — prefer these over calling getPreauthPreview directly. */
1183
+ export {
1184
+ checkPreauthStatus,
1185
+ usePreauthPreview,
1186
+ isPreauthFinalised,
1187
+ isPreauthTerminalFailure,
1188
+ isPreauthNeedsClarification,
1189
+ isPreauthResubmittable,
1190
+ interventionHasBlockingPreauth,
1191
+ interventionHasFailedPreauth,
1192
+ interventionAllowsPreauthResubmit,
1193
+ invalidatePreauthPreview,
1194
+ preauthPreviewSwrKey,
1195
+ type PreauthCheckKind,
1196
+ type PreauthCheckResult,
1197
+ } from '../../../../claims/claims.resource';