@ampath/esm-dha-workflow-app 4.0.0-next.13 → 4.0.0-next.131

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 (362) hide show
  1. package/dist/1197.js +1 -0
  2. package/dist/1277.js +1 -0
  3. package/dist/1277.js.map +1 -0
  4. package/dist/1558.js +2 -0
  5. package/dist/{198.js.LICENSE.txt → 1558.js.LICENSE.txt} +0 -10
  6. package/dist/1558.js.map +1 -0
  7. package/dist/1729.js +1 -0
  8. package/dist/1729.js.map +1 -0
  9. package/dist/182.js +1 -0
  10. package/dist/182.js.map +1 -0
  11. package/dist/1826.js +1 -0
  12. package/dist/1826.js.map +1 -0
  13. package/dist/1833.js +1 -0
  14. package/dist/1833.js.map +1 -0
  15. package/dist/1856.js +1 -0
  16. package/dist/1856.js.map +1 -0
  17. package/dist/1925.js +1 -0
  18. package/dist/1925.js.map +1 -0
  19. package/dist/2021.js +1 -0
  20. package/dist/2021.js.map +1 -0
  21. package/dist/2054.js +1 -0
  22. package/dist/2054.js.map +1 -0
  23. package/dist/2177.js +2 -0
  24. package/dist/2177.js.LICENSE.txt +9 -0
  25. package/dist/2177.js.map +1 -0
  26. package/dist/2364.js +2 -0
  27. package/dist/{200.js.LICENSE.txt → 2364.js.LICENSE.txt} +15 -0
  28. package/dist/2364.js.map +1 -0
  29. package/dist/2566.js +1 -0
  30. package/dist/2566.js.map +1 -0
  31. package/dist/2801.js +1 -0
  32. package/dist/2801.js.map +1 -0
  33. package/dist/2975.js +1 -0
  34. package/dist/2975.js.map +1 -0
  35. package/dist/3041.js +1 -0
  36. package/dist/3041.js.map +1 -0
  37. package/dist/3099.js +1 -0
  38. package/dist/3184.js +2 -0
  39. package/dist/3184.js.map +1 -0
  40. package/dist/3485.js +1 -0
  41. package/dist/3485.js.map +1 -0
  42. package/dist/3654.js +1 -0
  43. package/dist/3654.js.map +1 -0
  44. package/dist/4055.js +1 -0
  45. package/dist/4205.js +1 -0
  46. package/dist/4205.js.map +1 -0
  47. package/dist/4225.js +1 -0
  48. package/dist/4225.js.map +1 -0
  49. package/dist/4300.js +1 -0
  50. package/dist/4335.js +1 -0
  51. package/dist/4353.js +1 -0
  52. package/dist/4353.js.map +1 -0
  53. package/dist/4517.js +1 -0
  54. package/dist/4517.js.map +1 -0
  55. package/dist/4652.js +1 -0
  56. package/dist/4674.js +1 -0
  57. package/dist/4674.js.map +1 -0
  58. package/dist/4947.js +1 -0
  59. package/dist/4947.js.map +1 -0
  60. package/dist/5015.js +1 -0
  61. package/dist/5015.js.map +1 -0
  62. package/dist/5422.js +1 -0
  63. package/dist/5422.js.map +1 -0
  64. package/dist/5428.js +1 -0
  65. package/dist/5428.js.map +1 -0
  66. package/dist/5752.js +1 -0
  67. package/dist/5752.js.map +1 -0
  68. package/dist/5851.js +1 -0
  69. package/dist/5851.js.map +1 -0
  70. package/dist/6264.js +1 -0
  71. package/dist/6264.js.map +1 -0
  72. package/dist/6540.js +2 -0
  73. package/dist/6540.js.map +1 -0
  74. package/dist/6606.js +1 -0
  75. package/dist/6606.js.map +1 -0
  76. package/dist/693.js +1 -0
  77. package/dist/693.js.map +1 -0
  78. package/dist/6991.js +1 -0
  79. package/dist/6991.js.map +1 -0
  80. package/dist/7199.js +1 -0
  81. package/dist/7199.js.map +1 -0
  82. package/dist/7255.js +1 -0
  83. package/dist/7255.js.map +1 -0
  84. package/dist/7258.js +1 -0
  85. package/dist/7258.js.map +1 -0
  86. package/dist/7420.js +1 -0
  87. package/dist/7420.js.map +1 -0
  88. package/dist/8114.js +1 -0
  89. package/dist/8114.js.map +1 -0
  90. package/dist/8339.js +1 -0
  91. package/dist/8339.js.map +1 -0
  92. package/dist/8865.js +1 -0
  93. package/dist/8865.js.map +1 -0
  94. package/dist/8895.js +1 -0
  95. package/dist/8895.js.map +1 -0
  96. package/dist/9037.js +1 -0
  97. package/dist/9037.js.map +1 -0
  98. package/dist/9091.js +1 -0
  99. package/dist/9091.js.map +1 -0
  100. package/dist/9093.js +1 -0
  101. package/dist/9093.js.map +1 -0
  102. package/dist/9117.js +1 -0
  103. package/dist/9117.js.map +1 -0
  104. package/dist/9721.js +1 -0
  105. package/dist/9721.js.map +1 -0
  106. package/dist/esm-dha-workflow-app.js +1 -0
  107. package/dist/esm-dha-workflow-app.js.buildmanifest.json +1546 -0
  108. package/dist/esm-dha-workflow-app.js.map +1 -0
  109. package/dist/main.js +1 -1
  110. package/dist/main.js.map +1 -1
  111. package/dist/routes.json +1 -1
  112. package/package.json +11 -4
  113. package/src/accounting/accounting.component.tsx +13 -0
  114. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  115. package/src/admissions/admission-request-list/admission-request-list.tsx +134 -0
  116. package/src/admissions/admissions-dashboard.component.scss +15 -0
  117. package/src/admissions/admissions-dashboard.component.tsx +160 -0
  118. package/src/admissions/admissions.resource.ts +101 -0
  119. package/src/admissions/admitted-list/admitted-patients-list.tsx +141 -0
  120. package/src/admissions/constants/index.ts +33 -0
  121. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  122. package/src/admissions/discharged-list/discharged-list.tsx +58 -0
  123. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  124. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  125. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  126. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  127. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  128. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  129. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  130. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  131. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +109 -0
  132. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  133. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  134. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  135. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  136. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  137. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +84 -0
  138. package/src/admissions/types/index.ts +192 -0
  139. package/src/appointments/appointments.component.tsx +13 -0
  140. package/src/billing/api/billing.api.ts +95 -0
  141. package/src/billing/billing-root.tsx +20 -0
  142. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  143. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  144. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  145. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +409 -0
  146. package/src/billing/invoice/bill.resource.ts +47 -0
  147. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  148. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  149. package/src/billing/invoice/invoice.scss +113 -0
  150. package/src/billing/invoice/invoice.tsx +1371 -0
  151. package/src/billing/invoice/line-items/line-items.scss +0 -0
  152. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  153. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  154. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  155. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  156. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  157. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  158. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  159. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  160. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  161. package/src/billing/types/index.ts +84 -0
  162. package/src/billing/utils/index.ts +17 -0
  163. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  164. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  165. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +85 -0
  166. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  167. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +330 -0
  168. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +11 -0
  169. package/src/bookings/bookings.component.scss +7 -0
  170. package/src/bookings/bookings.component.tsx +31 -0
  171. package/src/bookings/daily/daily-bookings.component.scss +38 -0
  172. package/src/bookings/daily/daily-bookings.component.tsx +138 -0
  173. package/src/bookings/daily/daily-bookings.resource.ts +28 -0
  174. package/src/bookings/daily/filters/daily-bookings-filter.component.scss +15 -0
  175. package/src/bookings/daily/filters/daily-bookings-filter.component.tsx +80 -0
  176. package/src/bookings/daily/patient-list/daily-bookings-patient-list.component.tsx +97 -0
  177. package/src/bookings/types/index.ts +68 -0
  178. package/src/config-schema.ts +186 -32
  179. package/src/createDashboardLink.tsx +9 -0
  180. package/src/dashboard/charts/chart.component.scss +13 -0
  181. package/src/dashboard/charts/chart.component.tsx +54 -0
  182. package/src/dashboard/dashboard.component.scss +7 -0
  183. package/src/dashboard/dashboard.component.tsx +51 -0
  184. package/src/dashboard/overview/overview.component.scss +147 -0
  185. package/src/dashboard/overview/overview.component.tsx +115 -0
  186. package/src/dashboard/patient-list/patient-list.component.tsx +41 -0
  187. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  188. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  189. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  190. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  191. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  192. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  193. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  194. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  195. package/src/dashboard-meta/pharmacy-dashboard.meta.ts +6 -0
  196. package/src/dashboard-meta/queue-dashboard.meta.ts +6 -0
  197. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  198. package/src/dashboard-meta/registry-dashboard.meta.ts +6 -0
  199. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  200. package/src/dashboard-meta/triage-dashboard.meta.ts +6 -0
  201. package/src/hooks/useActions.ts +165 -0
  202. package/src/index.ts +113 -1
  203. package/src/laboratory/laboratory.component.tsx +13 -0
  204. package/src/left-panel/left-panel.component.tsx +0 -2
  205. package/src/mch/mch-queues.component.scss +7 -0
  206. package/src/mch/mch-queues.component.tsx +32 -0
  207. package/src/mch/queues/consultation/mch-consultation.tsx +18 -0
  208. package/src/mch/queues/triage/mch-triage.tsx +15 -0
  209. package/src/modals/sign-off-modal.scss +7 -0
  210. package/src/modals/sign-off-modal.tsx +52 -0
  211. package/src/mortuary/mortuary.component.tsx +13 -0
  212. package/src/pharmacy/pharmacy.component.tsx +13 -0
  213. package/src/registers/registers.component.tsx +8 -0
  214. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +6 -0
  215. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +137 -0
  216. package/src/registry/eligibility/modal/eligibility-details.modal.scss +38 -0
  217. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +131 -0
  218. package/src/registry/modal/client-details-modal/client-details-modal.tsx +9 -26
  219. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +31 -1
  220. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +145 -58
  221. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +16 -1
  222. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +681 -97
  223. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  224. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  225. package/src/registry/registry.component.scss +18 -1
  226. package/src/registry/registry.component.tsx +242 -111
  227. package/src/registry/registry.resource.ts +8 -5
  228. package/src/registry/types/index.ts +179 -1
  229. package/src/registry/utils/error-handler.ts +33 -0
  230. package/src/registry/utils/format-dependant-display-data.ts +8 -0
  231. package/src/registry/utils/hie-client-adapter.ts +312 -0
  232. package/src/registry/utils/mask-data.ts +11 -0
  233. package/src/resources/dashboard.resource.ts +20 -0
  234. package/src/resources/hie-amrs-automatic-registration.service.ts +16 -0
  235. package/src/resources/identifier-types.ts +29 -0
  236. package/src/resources/patient-resource.ts +62 -0
  237. package/src/resources/queue.resource.ts +23 -0
  238. package/src/resources/superset.resource.ts +20 -0
  239. package/src/resources/visit.resource.ts +19 -1
  240. package/src/root.component.tsx +32 -6
  241. package/src/routes.json +215 -7
  242. package/src/service-queues/action-button.component.tsx +34 -0
  243. package/src/service-queues/action-overflow-menu-item.component.tsx +34 -0
  244. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  245. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +142 -0
  246. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  247. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +150 -0
  248. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  249. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  250. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  251. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  252. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  253. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  254. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  255. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  256. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  257. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  258. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  259. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +34 -0
  260. package/src/service-queues/consultation/consultation.component.scss +7 -0
  261. package/src/service-queues/consultation/consultation.component.tsx +15 -0
  262. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  263. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  264. package/src/service-queues/metrics/metrics-cards/attended-patients.extension.tsx +38 -0
  265. package/src/service-queues/metrics/metrics-cards/metrics-card.component.tsx +86 -0
  266. package/src/service-queues/metrics/metrics-cards/metrics-card.scss +106 -0
  267. package/src/service-queues/metrics/metrics-cards/waiting-patients.extension.tsx +34 -0
  268. package/src/service-queues/metrics/metrics-container.component.tsx +23 -0
  269. package/src/service-queues/metrics/metrics-container.scss +36 -0
  270. package/src/service-queues/metrics/metrics.resource.ts +65 -0
  271. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  272. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +108 -0
  273. package/src/service-queues/modals/move/move-patient.component.scss +35 -0
  274. package/src/service-queues/modals/move/move-patient.component.tsx +152 -0
  275. package/src/service-queues/modals/serve/serve-patient.comppnent.scss +0 -0
  276. package/src/service-queues/modals/serve/serve-patient.comppnent.tsx +80 -0
  277. package/src/service-queues/modals/sign-off/sign-off.modal.scss +0 -0
  278. package/src/service-queues/modals/sign-off/sign-off.modal.tsx +79 -0
  279. package/src/service-queues/modals/transition/transition-patient.component.scss +0 -0
  280. package/src/service-queues/modals/transition/transition-patient.component.tsx +122 -0
  281. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  282. package/src/service-queues/queue-list/queue-list.component.scss +36 -0
  283. package/src/service-queues/queue-list/queue-list.component.tsx +249 -0
  284. package/src/service-queues/queue-room.component.tsx +39 -0
  285. package/src/service-queues/room/room.component.tsx +58 -0
  286. package/src/service-queues/service-queue/service-queue.component.scss +14 -0
  287. package/src/service-queues/service-queue/service-queue.component.tsx +399 -0
  288. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +12 -0
  289. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +63 -0
  290. package/src/service-queues/service-queue.scss +27 -0
  291. package/src/service-queues/service-queue.tsx +37 -0
  292. package/src/service-queues/service-queues.resource.ts +361 -0
  293. package/src/service-queues/service.resource.ts +28 -0
  294. package/src/shared/constants/civil-status.ts +29 -0
  295. package/src/shared/constants/concepts.ts +15 -0
  296. package/src/shared/constants/index.ts +1 -2
  297. package/src/shared/constants/patient-category.ts +6 -0
  298. package/src/shared/constants/person-attributes.ts +33 -0
  299. package/src/shared/constants/visit-types.ts +7 -0
  300. package/src/shared/services/billing.resource.ts +38 -0
  301. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  302. package/src/shared/services/client-payment.resource.ts +17 -0
  303. package/src/shared/services/eligibility.resource.ts +19 -0
  304. package/src/shared/services/encounters.resource.ts +27 -0
  305. package/src/shared/services/location.resource.ts +9 -0
  306. package/src/shared/types/index.ts +152 -0
  307. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  308. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  309. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  310. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  311. package/src/shared/ui/otp-input/otp-input.component.scss +14 -0
  312. package/src/shared/ui/otp-input/otp-input.component.tsx +90 -0
  313. package/src/shared/ui/stat-card/stat-card.component.scss +10 -0
  314. package/src/shared/ui/stat-card/stat-card.component.tsx +26 -0
  315. package/src/shared/ui/timer/timer.component.scss +5 -0
  316. package/src/shared/ui/timer/timer.component.tsx +40 -0
  317. package/src/shared/utils/get-base-url.ts +27 -0
  318. package/src/shared/utils/get-tag-type.ts +66 -0
  319. package/src/side-nav-menu/nav-link-config.ts +6 -4
  320. package/src/triage/metrics/attended-patients.extension.tsx +42 -0
  321. package/src/triage/metrics/metrics.scss +36 -0
  322. package/src/triage/metrics/triage-metrics.component.tsx +21 -0
  323. package/src/triage/metrics/waiting-patients.extension.tsx +39 -0
  324. package/src/triage/room/room.scss +29 -0
  325. package/src/triage/triage.component.tsx +15 -0
  326. package/src/triage/triage.resource.ts +19 -0
  327. package/src/triage/types.ts +16 -0
  328. package/src/types/types.ts +180 -0
  329. package/dist/16.js +0 -1
  330. package/dist/16.js.map +0 -1
  331. package/dist/184.js +0 -2
  332. package/dist/184.js.map +0 -1
  333. package/dist/197.js +0 -1
  334. package/dist/198.js +0 -2
  335. package/dist/198.js.map +0 -1
  336. package/dist/200.js +0 -2
  337. package/dist/200.js.map +0 -1
  338. package/dist/255.js +0 -1
  339. package/dist/255.js.map +0 -1
  340. package/dist/300.js +0 -1
  341. package/dist/335.js +0 -1
  342. package/dist/353.js +0 -1
  343. package/dist/353.js.map +0 -1
  344. package/dist/420.js +0 -1
  345. package/dist/420.js.map +0 -1
  346. package/dist/540.js +0 -2
  347. package/dist/540.js.map +0 -1
  348. package/dist/55.js +0 -1
  349. package/dist/652.js +0 -1
  350. package/dist/860.js +0 -1
  351. package/dist/860.js.map +0 -1
  352. package/dist/91.js +0 -1
  353. package/dist/91.js.map +0 -1
  354. package/dist/93.js +0 -1
  355. package/dist/93.js.map +0 -1
  356. package/dist/99.js +0 -1
  357. package/dist/openmrs-esm-home-app.js +0 -1
  358. package/dist/openmrs-esm-home-app.js.buildmanifest.json +0 -626
  359. package/dist/openmrs-esm-home-app.js.map +0 -1
  360. package/src/consultation/consultation.tsx +0 -7
  361. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  362. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
@@ -0,0 +1,409 @@
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
+ import styles from './visit-billing.extension.scss';
3
+ import { Select, SelectItem, TextInput } from '@carbon/react';
4
+ import {
5
+ createBill,
6
+ fetchBillableServices,
7
+ fetchCashPoints,
8
+ fetchPaymentModes,
9
+ } from '../../../shared/services/billing.resource';
10
+ import {
11
+ type ServicePrice,
12
+ type PaymentMode,
13
+ type PayableBillableService,
14
+ type CashPoint,
15
+ type BillableService,
16
+ type CreateBillDto,
17
+ } from '../../../shared/types';
18
+ import { PaymentDetail, type QueueEntryDto, type ServiceQueue } from '../../../registry/types';
19
+ import { PatientCategories } from '../../../shared/constants/patient-category';
20
+ import { QUEUE_PRIORITIES_UUIDS, QUEUE_STATUS_UUIDS } from '../../../shared/constants/concepts';
21
+ import { showSnackbar, useConfig, useSession, useVisit, type Visit } from '@openmrs/esm-framework';
22
+
23
+ interface VisitBillingFormProps {
24
+ patientUuid: string;
25
+ setExtraVisitInfo: (state) => void;
26
+ }
27
+ const VisitBillingForm: React.FC<VisitBillingFormProps> = ({ patientUuid, setExtraVisitInfo }) => {
28
+ const [paymentModes, setPaymentModes] = useState<PaymentMode[]>([]);
29
+ const [selectedPaymentDetail, setSelectedPaymentDetail] = useState<string>();
30
+ const [selectedBillableService, setSelectedBillableService] = useState<ServicePrice>(null);
31
+ const [filteredBillableServices, setFilteredBillableServices] = useState<ServicePrice[]>(null);
32
+ const [selectedPaymentMode, setSelectedPaymentMode] = useState<PaymentMode>(null);
33
+ const [selectedInsuranceScheme, setSelectedInsuranceScheme] = useState<string>('');
34
+ const [selectedInsurancePolicy, setSelectedInsurancePolicy] = useState<string>('');
35
+ const [servicePrices, setServicePrices] = useState<ServicePrice[]>([]);
36
+ const [selectedCashPoint, setSelectedCashPoint] = useState<CashPoint>(null);
37
+ const [selectedPriority, setSelectedPriority] = useState<string>('');
38
+ const [selectedPatientCategory, setSelectedPatientCategory] = useState<string>('');
39
+ const [selectedServiceQueue, setSelectedServiceQueue] = useState<string>();
40
+ const [serviceQueues, setServiceQueues] = useState<ServiceQueue[]>();
41
+ const [cashPoints, setCashPoints] = useState<CashPoint[]>([]);
42
+ const [billableServices, setBillableServices] = useState<BillableService[]>([]);
43
+ const { currentVisit } = useVisit(patientUuid);
44
+ const session = useSession();
45
+ const locationUuid = session.sessionLocation.uuid;
46
+ const facilityCashPoints = useMemo(() => getfacilityCashpoints(), [cashPoints, locationUuid]);
47
+ const { registrationBillableServices } = useConfig();
48
+
49
+ useEffect(() => {
50
+ getPaymentMethods();
51
+ getBillableServices();
52
+ getCashPoints();
53
+ }, []);
54
+
55
+ useEffect(() => {
56
+ if (selectedBillableService && selectedCashPoint) {
57
+ setExtraVisitInfo({
58
+ handleCreateExtraVisitInfo: createPatientBill,
59
+ attributes: [],
60
+ });
61
+ }
62
+ }, [selectedBillableService, selectedCashPoint]);
63
+
64
+ async function getCashPoints() {
65
+ const cp = await fetchCashPoints();
66
+ setCashPoints(cp);
67
+ }
68
+
69
+ async function getBillableServices() {
70
+ const billableServices = await fetchBillableServices();
71
+ setBillableServices(billableServices);
72
+ generateServiceTypesList(billableServices);
73
+ }
74
+
75
+ function generateServiceTypesList(billableServices: BillableService[]) {
76
+ const sp: ServicePrice[] = [];
77
+ for (let bs of billableServices) {
78
+ if (bs.servicePrices) {
79
+ const servicePrices = bs.servicePrices;
80
+ for (let servicePrice of servicePrices) {
81
+ sp.push(servicePrice);
82
+ }
83
+ }
84
+ }
85
+ setServicePrices(sp);
86
+ }
87
+
88
+ async function getPaymentMethods() {
89
+ const methods = await fetchPaymentModes();
90
+ setPaymentModes(methods);
91
+ }
92
+ const paymentMethodHandler = (selectedPaymentModeUuid: string) => {
93
+ const selectedPaymentMode = paymentModes.find((pm) => {
94
+ return pm.uuid === selectedPaymentModeUuid;
95
+ });
96
+ setSelectedPaymentMode(selectedPaymentMode);
97
+ const paymentModeBillableServices = getBillableServiceByPaymentMode(selectedPaymentMode);
98
+ setFilteredBillableServices(paymentModeBillableServices);
99
+ setSelectedInsuranceScheme('');
100
+ setSelectedInsurancePolicy('');
101
+ setSelectedPriority('');
102
+ };
103
+
104
+ const getBillableServiceByPaymentMode = (paymentMode: PaymentMode): PayableBillableService[] => {
105
+ const paymentBillableServices: ServicePrice[] = [];
106
+ servicePrices.forEach((sp) => {
107
+ if (sp.paymentMode) {
108
+ if (
109
+ sp.paymentMode.uuid === paymentMode.uuid &&
110
+ registrationBillableServices.includes(sp.billableService.uuid)
111
+ ) {
112
+ paymentBillableServices.push(sp);
113
+ }
114
+ }
115
+ });
116
+ return paymentBillableServices;
117
+ };
118
+
119
+ const paymentDetailsHandler = (paymentDetailSelected: string) => {
120
+ setSelectedPaymentDetail(paymentDetailSelected);
121
+ };
122
+ const paymentDetails = Object.values(PaymentDetail).map((value) => {
123
+ return {
124
+ id: value,
125
+ label: value,
126
+ };
127
+ });
128
+
129
+ const billableServicesHandler = (selectedBillableServiceUuid: string) => {
130
+ const selectedBillableService = servicePrices.find((sp) => {
131
+ return sp.uuid === selectedBillableServiceUuid;
132
+ });
133
+ setSelectedBillableService(selectedBillableService);
134
+ };
135
+
136
+ function hasSelectedPaymentMode(paymentMode: string): boolean {
137
+ if (!selectedPaymentMode) {
138
+ return false;
139
+ }
140
+ return selectedPaymentMode.name.trim().toLowerCase().includes(paymentMode.trim().toLowerCase());
141
+ }
142
+ const insuranceSchemeHandler = (selectedInsuranceScheme: string) => {
143
+ setSelectedInsuranceScheme(selectedInsuranceScheme);
144
+ };
145
+
146
+ const insurancePolicyHandler = (selectedInsurancePolicy: string) => {
147
+ setSelectedInsurancePolicy(selectedInsurancePolicy);
148
+ };
149
+
150
+ const cashPointsHandler = (selectedCashPointUuid: string) => {
151
+ const selectedCashPoint = cashPoints.find((cp) => {
152
+ return cp.uuid === selectedCashPointUuid;
153
+ });
154
+ setSelectedCashPoint(selectedCashPoint);
155
+ };
156
+
157
+ function getfacilityCashpoints() {
158
+ return cashPoints.filter((cp) => {
159
+ return cp && cp.location?.uuid === locationUuid;
160
+ });
161
+ }
162
+
163
+ const patientCategoryHandler = (categoryUuid: string) => {
164
+ setSelectedPatientCategory(categoryUuid);
165
+ };
166
+
167
+ function validateVisitQueueBill(): boolean {
168
+ if (!selectedPaymentDetail) {
169
+ showAlert('error', 'Please select a paying or non paying option', '');
170
+ return false;
171
+ }
172
+
173
+ if (selectedPaymentDetail === PaymentDetail.Paying) {
174
+ if (!selectedPaymentMode) {
175
+ showAlert('error', 'Please select a payment method', '');
176
+ return false;
177
+ }
178
+ if (!selectedBillableService) {
179
+ showAlert('error', 'Please select a billable service', '');
180
+ return false;
181
+ }
182
+ if (!selectedCashPoint) {
183
+ showAlert('error', 'Please select a cashpoint', '');
184
+ return false;
185
+ }
186
+ }
187
+ if (selectedPaymentDetail === PaymentDetail.NonPaying) {
188
+ if (!selectedPatientCategory) {
189
+ showAlert('error', 'Please select a patient category', '');
190
+ return false;
191
+ }
192
+ }
193
+ return true;
194
+ }
195
+
196
+ const showAlert = (alertType: 'error' | 'success', title: string, subtitle: string) => {
197
+ showSnackbar({
198
+ kind: alertType,
199
+ title: title,
200
+ subtitle: subtitle,
201
+ });
202
+ };
203
+
204
+ function isValidCreateBillDto(createBillDto: CreateBillDto): boolean {
205
+ if (!createBillDto.patient) {
206
+ showAlert('error', 'Please select a patient', '');
207
+ return false;
208
+ }
209
+ if (!createBillDto.status) {
210
+ showAlert('error', 'Bill does not have a status', '');
211
+ return false;
212
+ }
213
+ if (!createBillDto.cashPoint) {
214
+ showAlert('error', 'Please select a valid cashpoint', '');
215
+ return false;
216
+ }
217
+ if (!createBillDto.lineItems || createBillDto.lineItems.length === 0) {
218
+ showAlert('error', 'Please select a valid billable service', '');
219
+ return false;
220
+ }
221
+ return true;
222
+ }
223
+
224
+ async function createPatientBill() {
225
+ if (!validateVisitQueueBill()) return;
226
+ try {
227
+ // add bill if it was a paying client
228
+ let createBillResp = null;
229
+ if (selectedPaymentDetail === PaymentDetail.Paying) {
230
+ const createBillDto = generateCreateBillDto();
231
+ if (isValidCreateBillDto(createBillDto)) {
232
+ createBillResp = await createBill(createBillDto);
233
+ if (createBillResp) {
234
+ showAlert('success', 'Bill succesfully created', '');
235
+ }
236
+ } else {
237
+ return false;
238
+ }
239
+ }
240
+ } catch (error) {
241
+ console.log({ error });
242
+ }
243
+ }
244
+
245
+ const generateAddToTriageDto = (newVisit: Visit): QueueEntryDto => {
246
+ const payload: QueueEntryDto = {
247
+ visit: {
248
+ uuid: newVisit.uuid,
249
+ },
250
+ queueEntry: {
251
+ status: {
252
+ uuid: QUEUE_STATUS_UUIDS.WAITING_UUID,
253
+ },
254
+ priority: {
255
+ uuid: selectedPriority ?? QUEUE_PRIORITIES_UUIDS.NORMAL_PRIORITY_UUID,
256
+ },
257
+ queue: {
258
+ uuid: selectedServiceQueue,
259
+ },
260
+ patient: {
261
+ uuid: patientUuid,
262
+ },
263
+ startedAt: newVisit.startDatetime,
264
+ sortWeight: 0,
265
+ },
266
+ };
267
+ return payload;
268
+ };
269
+
270
+ function generateCreateBillDto(): CreateBillDto {
271
+ const payload: CreateBillDto = {
272
+ lineItems: [
273
+ {
274
+ billableService: selectedBillableService.billableService.uuid,
275
+ quantity: 1,
276
+ price: selectedBillableService.price,
277
+ priceName: selectedBillableService.name,
278
+ priceUuid: selectedBillableService.uuid,
279
+ lineItemOrder: 0,
280
+ paymentStatus: 'PENDING',
281
+ },
282
+ ],
283
+ cashPoint: selectedCashPoint.uuid,
284
+ patient: patientUuid,
285
+ status: 'PENDING',
286
+ payments: [],
287
+ };
288
+ return payload;
289
+ }
290
+
291
+ return (
292
+ <>
293
+ <div className={styles.visitLayout}>
294
+ <div className={styles.formSection}>
295
+ <div className={styles.formRow}>
296
+ <div className={styles.formControl}>
297
+ <Select
298
+ id="payment-details"
299
+ labelText="Payment Details"
300
+ onChange={($event) => paymentDetailsHandler($event.target.value)}
301
+ >
302
+ <SelectItem value="" text="Select" />;
303
+ {paymentDetails.map((pd) => {
304
+ return <SelectItem value={pd.id} text={pd.label} />;
305
+ })}
306
+ </Select>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ <div className={styles.formSection}>
311
+ {selectedPaymentDetail === PaymentDetail.Paying ? (
312
+ <>
313
+ <div className={styles.formRow}>
314
+ <div className={styles.formControl}>
315
+ <Select
316
+ id="payment-method"
317
+ labelText="Payment Method"
318
+ onChange={($event) => paymentMethodHandler($event.target.value)}
319
+ >
320
+ <SelectItem value="" text="Select" />;
321
+ {paymentModes &&
322
+ paymentModes.map((pm) => {
323
+ return <SelectItem value={pm.uuid} text={pm.name} />;
324
+ })}
325
+ </Select>
326
+ </div>
327
+ <div className={styles.formControl}>
328
+ <Select
329
+ id="billable-service"
330
+ labelText="Billable Services"
331
+ onChange={($event) => billableServicesHandler($event.target.value)}
332
+ >
333
+ <SelectItem value="" text="Select" />;
334
+ {filteredBillableServices &&
335
+ filteredBillableServices.map((sp) => {
336
+ return (
337
+ <SelectItem value={sp.uuid} text={`${sp.billableService.display}(${sp.name}:${sp.price})`} />
338
+ );
339
+ })}
340
+ </Select>
341
+ </div>
342
+ </div>
343
+ {hasSelectedPaymentMode('insurance') ? (
344
+ <>
345
+ <div className={styles.formRow}>
346
+ <div className={styles.formControl}>
347
+ <TextInput
348
+ id="insurance-scheme"
349
+ labelText="Insurance scheme"
350
+ onChange={(e) => insuranceSchemeHandler(e.target.value)}
351
+ />
352
+ </div>
353
+ <div className={styles.formControl}>
354
+ <TextInput
355
+ id="policy-number"
356
+ labelText="Policy number"
357
+ onChange={(e) => insurancePolicyHandler(e.target.value)}
358
+ />
359
+ </div>
360
+ </div>
361
+ </>
362
+ ) : (
363
+ <></>
364
+ )}
365
+ <div className={styles.formRow}>
366
+ <div className={styles.formControl}>
367
+ <Select
368
+ id="cash-point"
369
+ labelText="Cash Point"
370
+ onChange={($event) => cashPointsHandler($event.target.value)}
371
+ >
372
+ <SelectItem value="" text="Select" />;
373
+ {facilityCashPoints &&
374
+ facilityCashPoints.map((cp) => {
375
+ return <SelectItem value={cp.uuid} text={cp.name} />;
376
+ })}
377
+ </Select>
378
+ </div>
379
+ </div>
380
+ </>
381
+ ) : (
382
+ <></>
383
+ )}
384
+
385
+ {selectedPaymentDetail === PaymentDetail.NonPaying ? (
386
+ <>
387
+ <div className={styles.formRow}>
388
+ <div className={styles.formControl}>
389
+ <Select
390
+ id="patient-category"
391
+ labelText="Patient Category"
392
+ onChange={($event) => patientCategoryHandler($event.target.value)}
393
+ >
394
+ <SelectItem value="" text="Select" />;
395
+ <SelectItem value={PatientCategories.CCC_PATIENT_UUID} text="CCC" />;
396
+ <SelectItem value={PatientCategories.MCH_PATIENT_UUID} text="MCH" />;
397
+ </Select>
398
+ </div>
399
+ </div>
400
+ </>
401
+ ) : (
402
+ <></>
403
+ )}
404
+ </div>
405
+ </div>
406
+ </>
407
+ );
408
+ };
409
+ export default VisitBillingForm;
@@ -0,0 +1,47 @@
1
+ import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework';
2
+ import { type EditBillLineItemDto, type Bill, type PayBillDto, type Payment } from '../types';
3
+
4
+ export async function fetchBill(billUuid: string): Promise<Bill> {
5
+ const billUrl = `${restBaseUrl}/billing/bill/${billUuid}`;
6
+ const resp = await openmrsFetch<Bill>(billUrl);
7
+ const result = await resp.json();
8
+ return result;
9
+ }
10
+
11
+ export async function payBill(billUuid: string, payBillDto: PayBillDto): Promise<Payment> {
12
+ const billUrl = `${restBaseUrl}/billing/bill/${billUuid}/payment`;
13
+ const resp = await openmrsFetch<Bill>(billUrl, {
14
+ method: 'POST',
15
+ headers: { 'Content-Type': 'application/json' },
16
+ body: JSON.stringify(payBillDto),
17
+ });
18
+ const result = await resp.json();
19
+ return result;
20
+ }
21
+
22
+ export async function deleteBillLineItem(billLineItemUuid: string, deleteReason: string) {
23
+ const deleteBillLineItemUrl = `${restBaseUrl}/billing/billLineItem/${billLineItemUuid}?reason=${deleteReason}`;
24
+ const resp = await openmrsFetch<Bill>(deleteBillLineItemUrl, {
25
+ method: 'DELETE',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ });
28
+ return resp;
29
+ }
30
+
31
+ export async function editBillLineItem(billUuid: string, editBillLineItemDto: EditBillLineItemDto): Promise<Payment> {
32
+ const billUrl = `${restBaseUrl}/billing/bill/${billUuid}`;
33
+ const resp = await openmrsFetch<Bill>(billUrl, {
34
+ method: 'POST',
35
+ headers: { 'Content-Type': 'application/json' },
36
+ body: JSON.stringify(editBillLineItemDto),
37
+ });
38
+ const result = await resp.json();
39
+ return result;
40
+ }
41
+
42
+ export async function fetchPatientBills(patientUuid: string): Promise<Bill[]> {
43
+ const billUrl = `${restBaseUrl}/billing/bill?v=full&patientUuid=${patientUuid}`;
44
+ const resp = await openmrsFetch<Bill>(billUrl);
45
+ const result = await resp.json();
46
+ return result.results ?? [];
47
+ }
@@ -0,0 +1,17 @@
1
+ .headerCardLayout{
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 20%;
5
+ .headerTitle{
6
+ display: flex;
7
+ flex-direction: column;
8
+ width: 100%;
9
+ row-gap: 5px;
10
+ }
11
+ .headerDetails{
12
+ display: flex;
13
+ flex-direction: column;
14
+ width: 100%;
15
+ row-gap: 5px;
16
+ }
17
+ }
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import styles from './header-card.scss';
3
+ interface HeaderCardProps {
4
+ title: string;
5
+ subTitle: string;
6
+ }
7
+ const HeaderCard: React.FC<HeaderCardProps> = ({ title, subTitle }) => {
8
+ return (
9
+ <>
10
+ <div className={styles.headerCardLayout}>
11
+ <div className={styles.headerTitle}>
12
+ <h5>{title}</h5>
13
+ </div>
14
+ <div className={styles.headerDetails}>
15
+ <p>{subTitle}</p>
16
+ </div>
17
+ </div>
18
+ </>
19
+ );
20
+ };
21
+ export default HeaderCard;
@@ -0,0 +1,113 @@
1
+ .invoiceLayout {
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ row-gap: 15px;
6
+ padding: 2% 2%;
7
+
8
+ .invoiceHeader {
9
+ display: flex;
10
+ flex-direction: column;
11
+ width: 100%;
12
+ row-gap: 5px;
13
+ width: 100%;
14
+
15
+ .invoiceTitle {
16
+ display: flex;
17
+ flex-direction: row;
18
+ width: 100%;
19
+ }
20
+
21
+ .invoiceHeaderDetails {
22
+ display: flex;
23
+ flex-direction: row;
24
+ width: 100%;
25
+ row-gap: 5px;
26
+ }
27
+ }
28
+
29
+ .contentSection {
30
+ display: flex;
31
+ flex-direction: column;
32
+ width: 100%;
33
+ row-gap: 5px;
34
+ width: 100%;
35
+
36
+ .lineItemsSection {
37
+ display: flex;
38
+ flex-direction: column;
39
+ width: 100%;
40
+ row-gap: 15px;
41
+ width: 100%;
42
+
43
+ .lineItemsHeader {
44
+ display: flex;
45
+ flex-direction: row;
46
+ width: 100%;
47
+ }
48
+
49
+ .lineItemsData {
50
+ display: flex;
51
+ flex-direction: column;
52
+ width: 100%;
53
+ }
54
+ }
55
+
56
+ .paymentSection {
57
+ display: flex;
58
+ flex-direction: column;
59
+ width: 100%;
60
+ row-gap: 10px;
61
+ margin-top: 15px;
62
+
63
+ .paymentSectionHeader {
64
+ display: flex;
65
+ flex-direction: row;
66
+ width: 100%;
67
+ }
68
+ .paymentDetails{
69
+ display: flex;
70
+ flex-direction: column;
71
+ width: 100%;
72
+ row-gap: 10px;
73
+ }
74
+
75
+ .paymentSectionContent {
76
+ display: flex;
77
+ flex-direction: row;
78
+ width: 100%;
79
+ column-gap: 10px;
80
+ margin-top: 15px;
81
+
82
+ .paymentMethodSection {
83
+ display: flex;
84
+ flex-direction: row;
85
+ width: 70%;
86
+ column-gap: 5px;
87
+ }
88
+
89
+ .processPaymentSection {
90
+ display: flex;
91
+ flex-direction: column;
92
+ width: 30%;
93
+ row-gap: 15px;
94
+ .actionRow{
95
+ display: flex;
96
+ flex-direction: row;
97
+ column-gap: 5px;
98
+ width: 100%;
99
+ }
100
+ }
101
+
102
+ }
103
+
104
+ }
105
+ }
106
+ }
107
+
108
+ .formRow{
109
+ display: flex;
110
+ flex-direction: column;
111
+ width: 30%;
112
+ column-gap: 5px;
113
+ }