@kenyaemr/esm-etims-app 5.4.5-pre.1109

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 (321) hide show
  1. package/.turbo/turbo-build.log +6 -0
  2. package/README.md +3 -0
  3. package/dist/1067.js +1 -0
  4. package/dist/1067.js.map +1 -0
  5. package/dist/1072.js +1 -0
  6. package/dist/1072.js.map +1 -0
  7. package/dist/1148.js +1 -0
  8. package/dist/1148.js.map +1 -0
  9. package/dist/1278.js +1 -0
  10. package/dist/1278.js.map +1 -0
  11. package/dist/1442.js +1 -0
  12. package/dist/1442.js.map +1 -0
  13. package/dist/15.js +1 -0
  14. package/dist/15.js.map +1 -0
  15. package/dist/1620.js +1 -0
  16. package/dist/1620.js.map +1 -0
  17. package/dist/1638.js +1 -0
  18. package/dist/1638.js.map +1 -0
  19. package/dist/1789.js +1 -0
  20. package/dist/1789.js.map +1 -0
  21. package/dist/1831.js +1 -0
  22. package/dist/1831.js.map +1 -0
  23. package/dist/1844.js +1 -0
  24. package/dist/1844.js.map +1 -0
  25. package/dist/1946.js +1 -0
  26. package/dist/1946.js.map +1 -0
  27. package/dist/2007.js +1 -0
  28. package/dist/2007.js.map +1 -0
  29. package/dist/2115.js +1 -0
  30. package/dist/2115.js.map +1 -0
  31. package/dist/2131.js +1 -0
  32. package/dist/2131.js.map +1 -0
  33. package/dist/2152.js +1 -0
  34. package/dist/2152.js.map +1 -0
  35. package/dist/2202.js +1 -0
  36. package/dist/2202.js.map +1 -0
  37. package/dist/2394.js +1 -0
  38. package/dist/2394.js.map +1 -0
  39. package/dist/2534.js +1 -0
  40. package/dist/2534.js.map +1 -0
  41. package/dist/2537.js +1 -0
  42. package/dist/2537.js.map +1 -0
  43. package/dist/2556.js +1 -0
  44. package/dist/2556.js.map +1 -0
  45. package/dist/2621.js +1 -0
  46. package/dist/2621.js.map +1 -0
  47. package/dist/2648.js +1 -0
  48. package/dist/2648.js.map +1 -0
  49. package/dist/2795.js +1 -0
  50. package/dist/2795.js.map +1 -0
  51. package/dist/2842.js +1 -0
  52. package/dist/2842.js.map +1 -0
  53. package/dist/2916.js +1 -0
  54. package/dist/2916.js.map +1 -0
  55. package/dist/2924.js +1 -0
  56. package/dist/2924.js.map +1 -0
  57. package/dist/2929.js +1 -0
  58. package/dist/2929.js.map +1 -0
  59. package/dist/2947.js +1 -0
  60. package/dist/2947.js.map +1 -0
  61. package/dist/2971.js +1 -0
  62. package/dist/2971.js.map +1 -0
  63. package/dist/3284.js +1 -0
  64. package/dist/3284.js.map +1 -0
  65. package/dist/3285.js +1 -0
  66. package/dist/3285.js.map +1 -0
  67. package/dist/3335.js +1 -0
  68. package/dist/3335.js.map +1 -0
  69. package/dist/335.js +1 -0
  70. package/dist/335.js.map +1 -0
  71. package/dist/3378.js +1 -0
  72. package/dist/3378.js.map +1 -0
  73. package/dist/338.js +1 -0
  74. package/dist/338.js.map +1 -0
  75. package/dist/3504.js +1 -0
  76. package/dist/3504.js.map +1 -0
  77. package/dist/3544.js +1 -0
  78. package/dist/3544.js.map +1 -0
  79. package/dist/356.js +1 -0
  80. package/dist/356.js.map +1 -0
  81. package/dist/3569.js +1 -0
  82. package/dist/3569.js.map +1 -0
  83. package/dist/3723.js +1 -0
  84. package/dist/3723.js.map +1 -0
  85. package/dist/3745.js +1 -0
  86. package/dist/3745.js.map +1 -0
  87. package/dist/3813.js +1 -0
  88. package/dist/3813.js.map +1 -0
  89. package/dist/393.js +6 -0
  90. package/dist/393.js.map +1 -0
  91. package/dist/3949.js +1 -0
  92. package/dist/3949.js.map +1 -0
  93. package/dist/3953.js +1 -0
  94. package/dist/3953.js.map +1 -0
  95. package/dist/3989.js +1 -0
  96. package/dist/3989.js.map +1 -0
  97. package/dist/4178.js +1 -0
  98. package/dist/4178.js.map +1 -0
  99. package/dist/4303.js +1 -0
  100. package/dist/4303.js.map +1 -0
  101. package/dist/4308.js +1 -0
  102. package/dist/4308.js.map +1 -0
  103. package/dist/4487.js +11 -0
  104. package/dist/4487.js.map +1 -0
  105. package/dist/4588.js +1 -0
  106. package/dist/4588.js.map +1 -0
  107. package/dist/4637.js +1 -0
  108. package/dist/4637.js.map +1 -0
  109. package/dist/466.js +1 -0
  110. package/dist/466.js.map +1 -0
  111. package/dist/4817.js +1 -0
  112. package/dist/4817.js.map +1 -0
  113. package/dist/4818.js +1 -0
  114. package/dist/4818.js.map +1 -0
  115. package/dist/500.js +1 -0
  116. package/dist/500.js.map +1 -0
  117. package/dist/5086.js +1 -0
  118. package/dist/5086.js.map +1 -0
  119. package/dist/5117.js +1 -0
  120. package/dist/5117.js.map +1 -0
  121. package/dist/5159.js +1 -0
  122. package/dist/5159.js.map +1 -0
  123. package/dist/5285.js +1 -0
  124. package/dist/5285.js.map +1 -0
  125. package/dist/5361.js +1 -0
  126. package/dist/5361.js.map +1 -0
  127. package/dist/5366.js +1 -0
  128. package/dist/5366.js.map +1 -0
  129. package/dist/5484.js +1 -0
  130. package/dist/5484.js.map +1 -0
  131. package/dist/5598.js +1 -0
  132. package/dist/5598.js.map +1 -0
  133. package/dist/5676.js +1 -0
  134. package/dist/5676.js.map +1 -0
  135. package/dist/5694.js +1 -0
  136. package/dist/5694.js.map +1 -0
  137. package/dist/5731.js +5 -0
  138. package/dist/5731.js.map +1 -0
  139. package/dist/5743.js +1 -0
  140. package/dist/5743.js.map +1 -0
  141. package/dist/5825.js +1 -0
  142. package/dist/5825.js.map +1 -0
  143. package/dist/5932.js +1 -0
  144. package/dist/5932.js.map +1 -0
  145. package/dist/5941.js +1 -0
  146. package/dist/5941.js.map +1 -0
  147. package/dist/5967.js +1 -0
  148. package/dist/5967.js.map +1 -0
  149. package/dist/6104.js +1 -0
  150. package/dist/6104.js.map +1 -0
  151. package/dist/624.js +1 -0
  152. package/dist/624.js.map +1 -0
  153. package/dist/6259.js +1 -0
  154. package/dist/6259.js.map +1 -0
  155. package/dist/6273.js +1 -0
  156. package/dist/6273.js.map +1 -0
  157. package/dist/6337.js +1 -0
  158. package/dist/6337.js.map +1 -0
  159. package/dist/6427.js +1 -0
  160. package/dist/6427.js.map +1 -0
  161. package/dist/647.js +1 -0
  162. package/dist/647.js.map +1 -0
  163. package/dist/6478.js +7 -0
  164. package/dist/6478.js.map +1 -0
  165. package/dist/6508.js +1 -0
  166. package/dist/6508.js.map +1 -0
  167. package/dist/6567.js +1 -0
  168. package/dist/6567.js.map +1 -0
  169. package/dist/6634.js +1 -0
  170. package/dist/6634.js.map +1 -0
  171. package/dist/6868.js +1 -0
  172. package/dist/6868.js.map +1 -0
  173. package/dist/689.js +1 -0
  174. package/dist/689.js.map +1 -0
  175. package/dist/7022.js +1 -0
  176. package/dist/7022.js.map +1 -0
  177. package/dist/7101.js +1 -0
  178. package/dist/7101.js.map +1 -0
  179. package/dist/7209.js +1 -0
  180. package/dist/7209.js.map +1 -0
  181. package/dist/7293.js +1 -0
  182. package/dist/7293.js.map +1 -0
  183. package/dist/7360.js +1 -0
  184. package/dist/7360.js.map +1 -0
  185. package/dist/7453.js +1 -0
  186. package/dist/7453.js.map +1 -0
  187. package/dist/7478.js +1 -0
  188. package/dist/7478.js.map +1 -0
  189. package/dist/7782.js +1 -0
  190. package/dist/7782.js.map +1 -0
  191. package/dist/7808.js +1 -0
  192. package/dist/7808.js.map +1 -0
  193. package/dist/7876.js +1 -0
  194. package/dist/7876.js.map +1 -0
  195. package/dist/8028.js +1 -0
  196. package/dist/8028.js.map +1 -0
  197. package/dist/8196.js +1 -0
  198. package/dist/8196.js.map +1 -0
  199. package/dist/820.js +1 -0
  200. package/dist/820.js.map +1 -0
  201. package/dist/8240.js +1 -0
  202. package/dist/8240.js.map +1 -0
  203. package/dist/8458.js +1 -0
  204. package/dist/8458.js.map +1 -0
  205. package/dist/8472.js +1 -0
  206. package/dist/8472.js.map +1 -0
  207. package/dist/8602.js +1 -0
  208. package/dist/8602.js.map +1 -0
  209. package/dist/8607.js +1 -0
  210. package/dist/8607.js.map +1 -0
  211. package/dist/8640.js +1 -0
  212. package/dist/8640.js.map +1 -0
  213. package/dist/8762.js +1 -0
  214. package/dist/8762.js.map +1 -0
  215. package/dist/9060.js +1 -0
  216. package/dist/9060.js.map +1 -0
  217. package/dist/9061.js +1 -0
  218. package/dist/9061.js.map +1 -0
  219. package/dist/9087.js +1 -0
  220. package/dist/9087.js.map +1 -0
  221. package/dist/9168.js +1 -0
  222. package/dist/9168.js.map +1 -0
  223. package/dist/9213.js +1 -0
  224. package/dist/9213.js.map +1 -0
  225. package/dist/9286.js +1 -0
  226. package/dist/9286.js.map +1 -0
  227. package/dist/9425.js +1 -0
  228. package/dist/9520.js +1 -0
  229. package/dist/9520.js.map +1 -0
  230. package/dist/9547.js +1 -0
  231. package/dist/9547.js.map +1 -0
  232. package/dist/9612.js +1 -0
  233. package/dist/9612.js.map +1 -0
  234. package/dist/9632.js +1 -0
  235. package/dist/9632.js.map +1 -0
  236. package/dist/9771.js +1 -0
  237. package/dist/9771.js.map +1 -0
  238. package/dist/9774.js +1 -0
  239. package/dist/9774.js.map +1 -0
  240. package/dist/9806.js +1 -0
  241. package/dist/9806.js.map +1 -0
  242. package/dist/9885.js +1 -0
  243. package/dist/9885.js.map +1 -0
  244. package/dist/992.js +1 -0
  245. package/dist/992.js.map +1 -0
  246. package/dist/kenyaemr-esm-etims-app.js +3 -0
  247. package/dist/kenyaemr-esm-etims-app.js.buildmanifest.json +3354 -0
  248. package/dist/kenyaemr-esm-etims-app.js.map +1 -0
  249. package/dist/main.js +3 -0
  250. package/dist/main.js.map +1 -0
  251. package/dist/routes.json +1 -0
  252. package/package.json +48 -0
  253. package/rspack.config.js +1 -0
  254. package/src/components/header/header.component.tsx +22 -0
  255. package/src/components/header/header.scss +6 -0
  256. package/src/components/side-menu/left-panel.component.tsx +22 -0
  257. package/src/components/side-menu/left-panel.scss +34 -0
  258. package/src/components/user-menu-link/etims-nav-link.scss +29 -0
  259. package/src/components/user-menu-link/user-menu-link.component.tsx +25 -0
  260. package/src/config-schema.ts +1 -0
  261. package/src/credit-note/etims-credit-note-dashboard.component.tsx +23 -0
  262. package/src/credit-note/etims-credit-note-dashboard.scss +8 -0
  263. package/src/credit-note/etims-credit-note-table.component.tsx +284 -0
  264. package/src/credit-note/etims-credit-note-table.scss +16 -0
  265. package/src/credit-note/etims-credit-note.resource.ts +96 -0
  266. package/src/credit-note/etims-credit-note.types.ts +56 -0
  267. package/src/credit-note/etims-credit-note.workspace.scss +76 -0
  268. package/src/credit-note/etims-credit-note.workspace.tsx +267 -0
  269. package/src/declarations.d.ts +2 -0
  270. package/src/global-properties/etims-global-properties-dashboard.component.tsx +141 -0
  271. package/src/global-properties/etims-global-properties-dashboard.scss +62 -0
  272. package/src/global-properties/etims-global-properties-form.workspace.scss +74 -0
  273. package/src/global-properties/etims-global-properties-form.workspace.tsx +244 -0
  274. package/src/global-properties/etims-global-properties.resource.ts +60 -0
  275. package/src/index.ts +100 -0
  276. package/src/item-mapping/etims-item-mapping-dashboard.component.tsx +29 -0
  277. package/src/item-mapping/etims-item-mapping-dashboard.scss +42 -0
  278. package/src/item-mapping/etims-item-mapping-form.fields.tsx +136 -0
  279. package/src/item-mapping/etims-item-mapping-form.schema.ts +35 -0
  280. package/src/item-mapping/etims-item-mapping-form.workspace.scss +54 -0
  281. package/src/item-mapping/etims-item-mapping-form.workspace.tsx +555 -0
  282. package/src/item-mapping/etims-item-mapping-table.component.tsx +398 -0
  283. package/src/item-mapping/etims-item-mapping-table.scss +20 -0
  284. package/src/item-mapping/etims-item-mapping.resource.ts +318 -0
  285. package/src/item-mapping/etims-item-mapping.types.ts +92 -0
  286. package/src/item-mapping/register-item-mapping.modal.tsx +113 -0
  287. package/src/item-mapping/void-item-mapping.modal.tsx +80 -0
  288. package/src/left-panel-link.component.tsx +39 -0
  289. package/src/left-panel-link.scss +12 -0
  290. package/src/reference-data/etims-catalog-table.component.tsx +178 -0
  291. package/src/reference-data/etims-catalog-table.scss +16 -0
  292. package/src/reference-data/etims-code-table.component.tsx +87 -0
  293. package/src/reference-data/etims-item-class-table.component.tsx +86 -0
  294. package/src/reference-data/etims-reference-data-dashboard.component.tsx +38 -0
  295. package/src/reference-data/etims-reference-data-dashboard.scss +11 -0
  296. package/src/reference-data/etims-reference-data.resource.ts +40 -0
  297. package/src/reference-data/etims-reference-data.types.ts +38 -0
  298. package/src/reference-data/etims-sync-meta.modal.tsx +62 -0
  299. package/src/root.component.tsx +38 -0
  300. package/src/root.scss +11 -0
  301. package/src/routes.json +117 -0
  302. package/src/status/etims-status-dashboard.component.tsx +212 -0
  303. package/src/status/etims-status-dashboard.scss +116 -0
  304. package/src/status/etims-status.resource.ts +20 -0
  305. package/src/status/etims-status.types.ts +30 -0
  306. package/src/transaction/confirm-transaction-action.modal.tsx +113 -0
  307. package/src/transaction/etims-transaction-dashboard.component.tsx +23 -0
  308. package/src/transaction/etims-transaction-dashboard.scss +8 -0
  309. package/src/transaction/etims-transaction-details.workspace.scss +76 -0
  310. package/src/transaction/etims-transaction-details.workspace.tsx +201 -0
  311. package/src/transaction/etims-transaction-table.component.tsx +450 -0
  312. package/src/transaction/etims-transaction-table.scss +20 -0
  313. package/src/transaction/etims-transaction.resource.ts +180 -0
  314. package/src/transaction/etims-transaction.types.ts +78 -0
  315. package/src/transaction/override-reconciliation.modal.scss +7 -0
  316. package/src/transaction/override-reconciliation.modal.tsx +203 -0
  317. package/translations/am.json +129 -0
  318. package/translations/en.json +129 -0
  319. package/translations/fr.json +130 -0
  320. package/translations/sw.json +129 -0
  321. package/tsconfig.json +5 -0
@@ -0,0 +1,78 @@
1
+ export type EtimsTransactionStatus =
2
+ | 'PENDING'
3
+ | 'PROCESSING'
4
+ | 'SUBMITTED'
5
+ | 'CONFIRMED'
6
+ | 'RETRY'
7
+ | 'RECONCILIATION_REQUIRED'
8
+ | 'ACTION_REQUIRED'
9
+ | 'PERMANENTLY_FAILED'
10
+ | 'CANCELLED';
11
+
12
+ export type EtimsTransactionType = 'ORIGINAL_SALE' | 'CREDIT_NOTE' | 'REPLACEMENT_SALE';
13
+
14
+ export type EtimsReconciliationOverrideAction = 'CONFIRM' | 'REQUEUE' | 'PERMANENTLY_FAIL';
15
+
16
+ export interface EtimsTransaction {
17
+ uuid: string;
18
+ display?: string;
19
+ billId?: number | null;
20
+ transactionType?: EtimsTransactionType | null;
21
+ status?: EtimsTransactionStatus | null;
22
+ revisionNumber?: number | null;
23
+ traderInvoiceNumber?: string | null;
24
+ kraInvoiceNumber?: string | null;
25
+ resultCode?: string | null;
26
+ resultMessage?: string | null;
27
+ failureCategory?: string | null;
28
+ attemptCount?: number | null;
29
+ dateCreated?: string | null;
30
+ cuInvoiceNumber?: string | null;
31
+ kraReceiptNumber?: string | null;
32
+ qrUrl?: string | null;
33
+ sdcId?: string | null;
34
+ mrcNumber?: string | null;
35
+ confirmedAt?: string | null;
36
+ nextAttemptAt?: string | null;
37
+ originalTransactionId?: number | null;
38
+ receiptSignature?: string | null;
39
+ publicationDate?: string | null;
40
+ }
41
+
42
+ export interface EtimsTransactionSummary {
43
+ uuid: string;
44
+ billId?: number | null;
45
+ transactionType?: EtimsTransactionType | null;
46
+ status?: EtimsTransactionStatus | null;
47
+ kraInvoiceNumber?: string | null;
48
+ traderInvoiceNumber?: string | null;
49
+ resultCode?: string | null;
50
+ resultMessage?: string | null;
51
+ cuInvoiceNumber?: string | null;
52
+ receiptNumber?: string | null;
53
+ confirmedAt?: string | null;
54
+ }
55
+
56
+ export interface EtimsReconciliationOverride {
57
+ uuid: string;
58
+ action?: EtimsReconciliationOverrideAction | null;
59
+ previousStatus?: string | null;
60
+ newStatus?: string | null;
61
+ reason?: string | null;
62
+ evidenceReference?: string | null;
63
+ operatorUuid?: string | null;
64
+ dateCreated?: string | null;
65
+ }
66
+
67
+ export interface EtimsReconciliationOverridePayload {
68
+ action: EtimsReconciliationOverrideAction;
69
+ reason: string;
70
+ evidenceReference: string;
71
+ cuInvoiceNumber?: string;
72
+ receiptNumber?: string;
73
+ receiptSignature?: string;
74
+ sdcId?: string;
75
+ mrcNumber?: string;
76
+ qrUrl?: string;
77
+ publicationDate?: string;
78
+ }
@@ -0,0 +1,7 @@
1
+ @use '@carbon/layout';
2
+
3
+ .content {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: layout.$spacing-05;
7
+ }
@@ -0,0 +1,203 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import { Button, Dropdown, InlineLoading, TextArea, TextInput } from '@carbon/react';
3
+ import { showSnackbar } from '@openmrs/esm-framework';
4
+ import { useTranslation } from 'react-i18next';
5
+ import { overrideEtimsReconciliation } from './etims-transaction.resource';
6
+ import type { EtimsReconciliationOverrideAction, EtimsReconciliationOverridePayload } from './etims-transaction.types';
7
+ import styles from './override-reconciliation.modal.scss';
8
+
9
+ type OverrideReconciliationModalProps = {
10
+ close: () => void;
11
+ uuid: string;
12
+ displayName: string;
13
+ kraInvoiceNumber?: string | null;
14
+ onComplete: () => void;
15
+ };
16
+
17
+ type ActionItem = { id: EtimsReconciliationOverrideAction; label: string };
18
+
19
+ const OverrideReconciliationModal: React.FC<OverrideReconciliationModalProps> = ({
20
+ close,
21
+ uuid,
22
+ displayName,
23
+ kraInvoiceNumber,
24
+ onComplete,
25
+ }) => {
26
+ const { t } = useTranslation();
27
+ const [action, setAction] = useState<EtimsReconciliationOverrideAction>('REQUEUE');
28
+ const [reason, setReason] = useState('');
29
+ const [evidenceReference, setEvidenceReference] = useState('');
30
+ const [cuInvoiceNumber, setCuInvoiceNumber] = useState('');
31
+ const [receiptNumber, setReceiptNumber] = useState('');
32
+ const [receiptSignature, setReceiptSignature] = useState('');
33
+ const [sdcId, setSdcId] = useState('');
34
+ const [mrcNumber, setMrcNumber] = useState('');
35
+ const [qrUrl, setQrUrl] = useState('');
36
+ const [publicationDate, setPublicationDate] = useState('');
37
+ const [isSubmitting, setIsSubmitting] = useState(false);
38
+
39
+ const actionItems: ActionItem[] = useMemo(
40
+ () => [
41
+ { id: 'REQUEUE', label: t('requeue', 'Requeue') },
42
+ { id: 'CONFIRM', label: t('confirm', 'Confirm') },
43
+ { id: 'PERMANENTLY_FAIL', label: t('permanentlyFail', 'Permanently fail') },
44
+ ],
45
+ [t],
46
+ );
47
+
48
+ const confirmationComplete =
49
+ Boolean(cuInvoiceNumber.trim()) &&
50
+ Boolean(receiptNumber.trim()) &&
51
+ Boolean(receiptSignature.trim()) &&
52
+ Boolean(sdcId.trim()) &&
53
+ Boolean(mrcNumber.trim()) &&
54
+ Boolean(qrUrl.trim()) &&
55
+ Boolean(publicationDate.trim());
56
+
57
+ const canSubmit =
58
+ Boolean(reason.trim()) &&
59
+ Boolean(evidenceReference.trim()) &&
60
+ (action !== 'CONFIRM' || (Boolean(kraInvoiceNumber) && confirmationComplete));
61
+
62
+ const handleSubmit = async () => {
63
+ if (!canSubmit) {
64
+ return;
65
+ }
66
+
67
+ const payload: EtimsReconciliationOverridePayload = {
68
+ action,
69
+ reason: reason.trim(),
70
+ evidenceReference: evidenceReference.trim(),
71
+ };
72
+
73
+ if (action === 'CONFIRM') {
74
+ payload.cuInvoiceNumber = cuInvoiceNumber.trim();
75
+ payload.receiptNumber = receiptNumber.trim();
76
+ payload.receiptSignature = receiptSignature.trim();
77
+ payload.sdcId = sdcId.trim();
78
+ payload.mrcNumber = mrcNumber.trim();
79
+ payload.qrUrl = qrUrl.trim();
80
+ payload.publicationDate = publicationDate.trim();
81
+ }
82
+
83
+ setIsSubmitting(true);
84
+ try {
85
+ const result = await overrideEtimsReconciliation(uuid, payload);
86
+ showSnackbar({
87
+ kind: 'success',
88
+ title: t('overrideRecorded', 'Override recorded'),
89
+ subtitle:
90
+ result.resultMessage ?? t('transactionStatusUpdated', 'Status: {{status}}', { status: result.status }),
91
+ });
92
+ onComplete();
93
+ close();
94
+ } catch (error: any) {
95
+ showSnackbar({
96
+ kind: 'error',
97
+ title: t('overrideError', 'Unable to record override'),
98
+ subtitle: error?.message,
99
+ });
100
+ } finally {
101
+ setIsSubmitting(false);
102
+ }
103
+ };
104
+
105
+ return (
106
+ <>
107
+ <div className="cds--modal-header">
108
+ <h3 className="cds--modal-header__heading">{t('recordOverride', 'Record override')}</h3>
109
+ </div>
110
+ <div className={`cds--modal-content ${styles.content}`}>
111
+ <p>
112
+ {t(
113
+ 'recordOverrideConfirmation',
114
+ 'Record an evidence-based status change for "{{displayName}}". Gateway lookup should be tried first. Confirm requires a reserved KRA invoice number.',
115
+ { displayName },
116
+ )}
117
+ </p>
118
+ <Dropdown
119
+ id="override-action"
120
+ titleText={t('overrideAction', 'Action')}
121
+ label={t('selectOverrideAction', 'Select action')}
122
+ items={actionItems}
123
+ itemToString={(item) => item?.label ?? ''}
124
+ selectedItem={actionItems.find((item) => item.id === action)}
125
+ onChange={({ selectedItem }) => setAction(selectedItem?.id ?? 'REQUEUE')}
126
+ />
127
+ <TextArea
128
+ id="override-reason"
129
+ labelText={t('reason', 'Reason')}
130
+ value={reason}
131
+ onChange={(event) => setReason(event.target.value)}
132
+ />
133
+ <TextInput
134
+ id="override-evidence"
135
+ labelText={t('evidenceReference', 'Evidence')}
136
+ value={evidenceReference}
137
+ onChange={(event) => setEvidenceReference(event.target.value)}
138
+ />
139
+ {action === 'CONFIRM' ? (
140
+ <>
141
+ <TextInput
142
+ id="override-cu-invoice"
143
+ labelText={t('cuInvoiceNumber', 'CU invoice')}
144
+ value={cuInvoiceNumber}
145
+ onChange={(event) => setCuInvoiceNumber(event.target.value)}
146
+ />
147
+ <TextInput
148
+ id="override-receipt-number"
149
+ labelText={t('receiptNumber', 'Receipt number')}
150
+ value={receiptNumber}
151
+ onChange={(event) => setReceiptNumber(event.target.value)}
152
+ />
153
+ <TextInput
154
+ id="override-receipt-signature"
155
+ labelText={t('receiptSignature', 'Receipt signature')}
156
+ value={receiptSignature}
157
+ onChange={(event) => setReceiptSignature(event.target.value)}
158
+ />
159
+ <TextInput
160
+ id="override-sdc-id"
161
+ labelText={t('sdcId', 'SDC ID')}
162
+ value={sdcId}
163
+ onChange={(event) => setSdcId(event.target.value)}
164
+ />
165
+ <TextInput
166
+ id="override-mrc-number"
167
+ labelText={t('mrcNumber', 'MRC number')}
168
+ value={mrcNumber}
169
+ onChange={(event) => setMrcNumber(event.target.value)}
170
+ />
171
+ <TextInput
172
+ id="override-qr-url"
173
+ labelText={t('qrUrl', 'QR URL')}
174
+ value={qrUrl}
175
+ onChange={(event) => setQrUrl(event.target.value)}
176
+ />
177
+ <TextInput
178
+ id="override-publication-date"
179
+ labelText={t('publicationDate', 'Publication date')}
180
+ helperText={t('publicationDateHelper', 'ISO datetime, for example 2026-08-13T10:15:30.000+0300')}
181
+ value={publicationDate}
182
+ onChange={(event) => setPublicationDate(event.target.value)}
183
+ />
184
+ </>
185
+ ) : null}
186
+ </div>
187
+ <div className="cds--modal-footer">
188
+ <Button kind="secondary" onClick={close} disabled={isSubmitting}>
189
+ {t('cancel', 'Cancel')}
190
+ </Button>
191
+ <Button kind="primary" onClick={handleSubmit} disabled={isSubmitting || !canSubmit}>
192
+ {isSubmitting ? (
193
+ <InlineLoading description={t('saving', 'Saving...')} />
194
+ ) : (
195
+ t('recordOverride', 'Record override')
196
+ )}
197
+ </Button>
198
+ </div>
199
+ </>
200
+ );
201
+ };
202
+
203
+ export default OverrideReconciliationModal;
@@ -0,0 +1,129 @@
1
+ {
2
+ "actionRequired": "Action required",
3
+ "active": "Active",
4
+ "addItemMapping": "Add item mapping",
5
+ "allStatuses": "All statuses",
6
+ "apiKeyConfigured": "API key configured",
7
+ "attemptCount": "Attempts",
8
+ "baseUrl": "Base URL",
9
+ "billableServiceSource": "Service #{{id}}",
10
+ "billId": "Bill ID",
11
+ "branchId": "Branch ID",
12
+ "businessPin": "Business PIN",
13
+ "cancelled": "Cancelled",
14
+ "classListSync": "Class list sync",
15
+ "code": "Code",
16
+ "codeCategory": "Category",
17
+ "codeCategoryName": "Category name",
18
+ "codeListSync": "Code list sync",
19
+ "configuration": "Configuration",
20
+ "configure": "Configure",
21
+ "confirmed": "Confirmed",
22
+ "confirmedAt": "Confirmed at",
23
+ "connectionOverview": "Connection overview",
24
+ "contractVersion": "Contract version",
25
+ "createCreditNote": "Create credit note",
26
+ "creditNotes": "Credit notes",
27
+ "creditNotesDescription": "Raise credit notes against confirmed eTIMS invoices and track their submission to KRA.",
28
+ "dateCreated": "Date created",
29
+ "description": "Description",
30
+ "downloading": "Downloading...",
31
+ "downloadTaxInvoice": "Download tax invoice",
32
+ "edit": "Edit",
33
+ "environment": "Environment",
34
+ "etims": "eTIMS",
35
+ "etimsCodes": "eTIMS codes",
36
+ "etimsCodesDescription": "Synchronized KRA reference codes such as tax types, item types, and units. Search by name, code, or category.",
37
+ "etimsCodesError": "eTIMS codes",
38
+ "eTimsConfigs": "Etims Configs",
39
+ "etimsEnabled": "eTIMS enabled",
40
+ "etimsGlobalProperties": "eTIMS global properties",
41
+ "etimsGlobalPropertiesDescription": "Review the global properties used by the eTIMS integration.",
42
+ "etimsItemClasses": "eTIMS item classes",
43
+ "etimsItemClassesDescription": "Synchronized KRA item classes used when mapping and registering cashier items. Search by name or item class code.",
44
+ "etimsItemClassesError": "eTIMS item classes",
45
+ "etimsLeftPanel": "eTIMS left panel",
46
+ "etimsStatus": "eTIMS status",
47
+ "failed": "Failed",
48
+ "gatewayHealth": "Gateway health",
49
+ "healthy": "Healthy",
50
+ "invalid": "Invalid",
51
+ "itemClassCode": "Item class code",
52
+ "itemCode": "Item code",
53
+ "itemMappings": "Item mappings",
54
+ "itemMappingsDescription": "Map cashier billable services and stock items to KRA item codes, then sync them to eTIMS.",
55
+ "itemMappingsError": "Item mappings",
56
+ "itemName": "Item name",
57
+ "itemsPerPage": "Items per page:",
58
+ "itemType": "Item type",
59
+ "kraInvoiceNumber": "KRA invoice",
60
+ "lastFailureAt": "Last failure",
61
+ "lastFailureMessage": "Last failure message",
62
+ "lastRecordCount": "Last record count",
63
+ "lastRequestDatetime": "Last request",
64
+ "lastSuccessAt": "Last success",
65
+ "licenceResultCode": "Licence result code",
66
+ "licenceStatus": "Licence",
67
+ "loadingEtimsStatus": "Loading eTIMS status...",
68
+ "minMaxItems": "{{min}}-{{max}} of {{total}} items",
69
+ "missingBillId": "This transaction has no bill ID",
70
+ "name": "Name",
71
+ "nextPage": "Next page",
72
+ "no": "No",
73
+ "pageRangeText_one": "of {{count}} pages",
74
+ "pageRangeText_other": "of {{count}} pages",
75
+ "pending": "Pending",
76
+ "permanentlyFailed": "Permanently failed",
77
+ "previousPage": "Previous page",
78
+ "processing": "Processing",
79
+ "property": "Property",
80
+ "reconcileWithKra": "Reconcile with KRA",
81
+ "reconciliationRequired": "Reconciliation required",
82
+ "recordedValue": "Recorded value",
83
+ "recordOverride": "Record override",
84
+ "referenceData": "Reference data",
85
+ "referenceDataSync": "Reference data sync",
86
+ "refreshing": "Refreshing...",
87
+ "refreshStatus": "Refresh status",
88
+ "registered": "Registered",
89
+ "registeredAt": "Registered at",
90
+ "registrationStatus": "Registration",
91
+ "resultMessage": "Last result",
92
+ "retry": "Retry",
93
+ "retrySubmission": "Retry submission",
94
+ "rowActions": "Row actions",
95
+ "sandboxValidatedContractVersion": "Sandbox validated contract version",
96
+ "searchCreditNotes": "Search by bill ID, invoice, or result",
97
+ "searchEtimsCodes": "Search eTIMS codes",
98
+ "searchEtimsItemClasses": "Search eTIMS item classes",
99
+ "searchForGlobalProperties": "Search for global properties",
100
+ "searchItemMappings": "Search mappings",
101
+ "searchTransactions": "Search by bill ID, invoice, or result",
102
+ "source": "Source",
103
+ "status": "Status",
104
+ "stockItemSource": "Stock #{{id}}",
105
+ "submitted": "Submitted",
106
+ "sync": "Sync",
107
+ "syncAllToKra": "Sync all to KRA",
108
+ "syncCategory": "Category",
109
+ "syncClassListMessage": "Synchronization of class list from KRA, this will update class list to latest version, Do you want to proceed?",
110
+ "syncCodeList": "Sync class list",
111
+ "syncCodeListMessage": "Synchronization of code list from KRA, this will update code list to latest version, Do you want to proceed?",
112
+ "syncHasFailures": "Needs attention",
113
+ "syncHealthy": "Healthy",
114
+ "syncSelectedToKra": "Sync selected to KRA",
115
+ "syncToKra": "Sync to KRA",
116
+ "taxInvoiceDownloaded": "Tax invoice downloaded",
117
+ "taxInvoiceError": "Unable to download tax invoice",
118
+ "taxType": "Tax type",
119
+ "traderInvoiceNumber": "Trader invoice",
120
+ "transactions": "Transactions",
121
+ "transactionsDescription": "Review the fiscal outbox, retry failed submissions, and reconcile ambiguous KRA results.",
122
+ "transactionsError": "Transactions",
123
+ "transactionType": "Type",
124
+ "unhealthy": "Unhealthy",
125
+ "valid": "Valid",
126
+ "viewDetails": "View details",
127
+ "void": "Void",
128
+ "yes": "Yes"
129
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "actionRequired": "Action required",
3
+ "active": "Active",
4
+ "addItemMapping": "Add item mapping",
5
+ "allStatuses": "All statuses",
6
+ "apiKeyConfigured": "API key configured",
7
+ "attemptCount": "Attempts",
8
+ "baseUrl": "Base URL",
9
+ "billableServiceSource": "Service #{{id}}",
10
+ "billId": "Bill ID",
11
+ "branchId": "Branch ID",
12
+ "businessPin": "Business PIN",
13
+ "cancelled": "Cancelled",
14
+ "classListSync": "Class list sync",
15
+ "code": "Code",
16
+ "codeCategory": "Category",
17
+ "codeCategoryName": "Category name",
18
+ "codeListSync": "Code list sync",
19
+ "configuration": "Configuration",
20
+ "configure": "Configure",
21
+ "confirmed": "Confirmed",
22
+ "confirmedAt": "Confirmed at",
23
+ "connectionOverview": "Connection overview",
24
+ "contractVersion": "Contract version",
25
+ "createCreditNote": "Create credit note",
26
+ "creditNotes": "Credit notes",
27
+ "creditNotesDescription": "Raise credit notes against confirmed eTIMS invoices and track their submission to KRA.",
28
+ "dateCreated": "Date created",
29
+ "description": "Description",
30
+ "downloading": "Downloading...",
31
+ "downloadTaxInvoice": "Download tax invoice",
32
+ "edit": "Edit",
33
+ "environment": "Environment",
34
+ "etims": "eTIMS",
35
+ "etimsCodes": "eTIMS codes",
36
+ "etimsCodesDescription": "Synchronized KRA reference codes such as tax types, item types, and units. Search by name, code, or category.",
37
+ "etimsCodesError": "eTIMS codes",
38
+ "eTimsConfigs": "Etims Configs",
39
+ "etimsEnabled": "eTIMS enabled",
40
+ "etimsGlobalProperties": "eTIMS global properties",
41
+ "etimsGlobalPropertiesDescription": "Review the global properties used by the eTIMS integration.",
42
+ "etimsItemClasses": "eTIMS item classes",
43
+ "etimsItemClassesDescription": "Synchronized KRA item classes used when mapping and registering cashier items. Search by name or item class code.",
44
+ "etimsItemClassesError": "eTIMS item classes",
45
+ "etimsLeftPanel": "eTIMS left panel",
46
+ "etimsStatus": "eTIMS status",
47
+ "failed": "Failed",
48
+ "gatewayHealth": "Gateway health",
49
+ "healthy": "Healthy",
50
+ "invalid": "Invalid",
51
+ "itemClassCode": "Item class",
52
+ "itemCode": "Item code",
53
+ "itemMappings": "Item mappings",
54
+ "itemMappingsDescription": "Map cashier billable services and stock items to KRA item codes, then sync them to eTIMS.",
55
+ "itemMappingsError": "Item mappings",
56
+ "itemName": "Item name",
57
+ "itemsPerPage": "Items per page:",
58
+ "itemType": "Item type",
59
+ "kraInvoiceNumber": "KRA invoice",
60
+ "lastFailureAt": "Last failure",
61
+ "lastFailureMessage": "Last failure message",
62
+ "lastRecordCount": "Last record count",
63
+ "lastRequestDatetime": "Last request",
64
+ "lastSuccessAt": "Last success",
65
+ "licenceResultCode": "Licence result code",
66
+ "licenceStatus": "Licence",
67
+ "loadingEtimsStatus": "Loading eTIMS status...",
68
+ "minMaxItems": "{{min}}-{{max}} of {{total}} items",
69
+ "missingBillId": "This transaction has no bill ID",
70
+ "name": "Name",
71
+ "nextPage": "Next page",
72
+ "no": "No",
73
+ "pageRangeText_one": "of {{count}} pages",
74
+ "pageRangeText_other": "of {{count}} pages",
75
+ "pending": "Pending",
76
+ "permanentlyFailed": "Permanently failed",
77
+ "previousPage": "Previous page",
78
+ "processing": "Processing",
79
+ "property": "Property",
80
+ "reconcileWithKra": "Reconcile with KRA",
81
+ "reconciliationRequired": "Reconciliation required",
82
+ "recordedValue": "Recorded value",
83
+ "recordOverride": "Record override",
84
+ "referenceData": "Reference data",
85
+ "referenceDataSync": "Reference data sync",
86
+ "refreshing": "Refreshing...",
87
+ "refreshStatus": "Refresh status",
88
+ "registered": "Registered",
89
+ "registeredAt": "Registered at",
90
+ "registrationStatus": "Registration",
91
+ "resultMessage": "Last result",
92
+ "retry": "Retry",
93
+ "retrySubmission": "Retry submission",
94
+ "rowActions": "Row actions",
95
+ "sandboxValidatedContractVersion": "Sandbox validated contract version",
96
+ "searchCreditNotes": "Search by bill ID, invoice, or result",
97
+ "searchEtimsCodes": "Search eTIMS codes",
98
+ "searchEtimsItemClasses": "Search eTIMS item classes",
99
+ "searchForGlobalProperties": "Search for global properties",
100
+ "searchItemMappings": "Search mappings",
101
+ "searchTransactions": "Search by bill ID, invoice, or result",
102
+ "source": "Source",
103
+ "status": "Status",
104
+ "stockItemSource": "Stock #{{id}}",
105
+ "submitted": "Submitted",
106
+ "sync": "Sync",
107
+ "syncAllToKra": "Sync all to KRA",
108
+ "syncCategory": "Category",
109
+ "syncClassListMessage": "Synchronization of class list from KRA, this will update class list to latest version, Do you want to proceed?",
110
+ "syncCodeList": "Sync class list",
111
+ "syncCodeListMessage": "Synchronization of code list from KRA, this will update code list to latest version, Do you want to proceed?",
112
+ "syncHasFailures": "Needs attention",
113
+ "syncHealthy": "Healthy",
114
+ "syncSelectedToKra": "Sync selected to KRA",
115
+ "syncToKra": "Sync to KRA",
116
+ "taxInvoiceDownloaded": "Tax invoice downloaded",
117
+ "taxInvoiceError": "Unable to download tax invoice",
118
+ "taxType": "Tax type",
119
+ "traderInvoiceNumber": "Trader invoice",
120
+ "transactions": "Transactions",
121
+ "transactionsDescription": "Review the fiscal outbox, retry failed submissions, and reconcile ambiguous KRA results.",
122
+ "transactionsError": "Transactions",
123
+ "transactionType": "Type",
124
+ "unhealthy": "Unhealthy",
125
+ "valid": "Valid",
126
+ "viewDetails": "View details",
127
+ "void": "Void",
128
+ "yes": "Yes"
129
+ }