@argusoft/medplat-product-management 1.0.2 → 1.0.4

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 (83) hide show
  1. package/dist/{BrandsPage-CSA3meke.js → BrandsPage-BE3kn-8b.js} +77 -75
  2. package/dist/BrandsPage-BE3kn-8b.js.map +1 -0
  3. package/dist/{CategoriesPage-BrspzkJL.js → CategoriesPage-COqi3pMi.js} +71 -70
  4. package/dist/{CategoriesPage-BrspzkJL.js.map → CategoriesPage-COqi3pMi.js.map} +1 -1
  5. package/dist/{DashboardPage-CqaquOs2.js → DashboardPage-C_H1Jrey.js} +90 -89
  6. package/dist/DashboardPage-C_H1Jrey.js.map +1 -0
  7. package/dist/{FacilityPicker-Dv_H95WW.js → FacilityPicker-Diq2hnYg.js} +2 -2
  8. package/dist/{FacilityPicker-Dv_H95WW.js.map → FacilityPicker-Diq2hnYg.js.map} +1 -1
  9. package/dist/{InventoryPage-CPbzfDMR.js → InventoryPage-Bjpw6vTz.js} +106 -115
  10. package/dist/InventoryPage-Bjpw6vTz.js.map +1 -0
  11. package/dist/{MemberProfileCard-0vjO3Gzd.js → MemberProfileCard-BLUVRILO.js} +10 -9
  12. package/dist/MemberProfileCard-BLUVRILO.js.map +1 -0
  13. package/dist/{PaymentCreatePage-BYmDZAIB.js → PaymentCreatePage-B5VOgTx9.js} +173 -177
  14. package/dist/PaymentCreatePage-B5VOgTx9.js.map +1 -0
  15. package/dist/{PaymentsPage-BXPvKon-.js → PaymentsPage-DY6BclkN.js} +24 -23
  16. package/dist/{PaymentsPage-BXPvKon-.js.map → PaymentsPage-DY6BclkN.js.map} +1 -1
  17. package/dist/PickupCreatePage-CCSiyFQF.js +706 -0
  18. package/dist/PickupCreatePage-CCSiyFQF.js.map +1 -0
  19. package/dist/{PickupsPage-D66_Wta4.js → PickupsPage-DGi6T5Of.js} +83 -90
  20. package/dist/PickupsPage-DGi6T5Of.js.map +1 -0
  21. package/dist/PmGuard-C90yhpsN.js +592 -0
  22. package/dist/PmGuard-C90yhpsN.js.map +1 -0
  23. package/dist/{PmTable-B9970kPY.js → PmTable-BkK65bJQ.js} +98 -98
  24. package/dist/PmTable-BkK65bJQ.js.map +1 -0
  25. package/dist/{ProductEditPage-B8qFTCW9.js → ProductEditPage-CQj9egzW.js} +138 -137
  26. package/dist/ProductEditPage-CQj9egzW.js.map +1 -0
  27. package/dist/{ProductsPage-C7_r9cKn.js → ProductsPage-i8QVw_Jm.js} +65 -64
  28. package/dist/{ProductsPage-C7_r9cKn.js.map → ProductsPage-i8QVw_Jm.js.map} +1 -1
  29. package/dist/PurchaseCreatePage-Bp6bl9n8.js +591 -0
  30. package/dist/PurchaseCreatePage-Bp6bl9n8.js.map +1 -0
  31. package/dist/{PurchaseRequestDetailPage-C7aAwEqw.js → PurchaseRequestDetailPage-CNAqIFef.js} +216 -215
  32. package/dist/PurchaseRequestDetailPage-CNAqIFef.js.map +1 -0
  33. package/dist/{PurchaseRequestsPage-BwCkbpaX.js → PurchaseRequestsPage-BJqDlNrc.js} +57 -56
  34. package/dist/{PurchaseRequestsPage-BwCkbpaX.js.map → PurchaseRequestsPage-BJqDlNrc.js.map} +1 -1
  35. package/dist/{PurchasesPage-CvaZouVy.js → PurchasesPage-BQEToymQ.js} +76 -75
  36. package/dist/{PurchasesPage-CvaZouVy.js.map → PurchasesPage-BQEToymQ.js.map} +1 -1
  37. package/dist/{SaleCreatePage-DP1Qmltu.js → SaleCreatePage-DbfBK4PH.js} +149 -173
  38. package/dist/SaleCreatePage-DbfBK4PH.js.map +1 -0
  39. package/dist/{SalesPage-CO3cdYX5.js → SalesPage-CTBJMxZe.js} +50 -49
  40. package/dist/SalesPage-CTBJMxZe.js.map +1 -0
  41. package/dist/SettingsPage-CiwVmzM3.js +663 -0
  42. package/dist/SettingsPage-CiwVmzM3.js.map +1 -0
  43. package/dist/{StorageUnitsPage-B9Hr_RkW.js → StorageUnitsPage-BV7nK_iE.js} +57 -56
  44. package/dist/{StorageUnitsPage-B9Hr_RkW.js.map → StorageUnitsPage-BV7nK_iE.js.map} +1 -1
  45. package/dist/{TransactionsPage-HKIGwEZN.js → TransactionsPage-Cocn4901.js} +55 -54
  46. package/dist/TransactionsPage-Cocn4901.js.map +1 -0
  47. package/dist/TransferCreatePage-DbjcjuOg.js +316 -0
  48. package/dist/TransferCreatePage-DbjcjuOg.js.map +1 -0
  49. package/dist/TransfersPage-BFVF7Xvc.js +471 -0
  50. package/dist/TransfersPage-BFVF7Xvc.js.map +1 -0
  51. package/dist/VialsPage-BNzYTLVd.js +321 -0
  52. package/dist/VialsPage-BNzYTLVd.js.map +1 -0
  53. package/dist/index.js +652 -34
  54. package/dist/index.js.map +1 -1
  55. package/dist/settingsStore-KW217unV.js +417 -0
  56. package/dist/settingsStore-KW217unV.js.map +1 -0
  57. package/package.json +1 -1
  58. package/dist/BrandsPage-CSA3meke.js.map +0 -1
  59. package/dist/DashboardPage-CqaquOs2.js.map +0 -1
  60. package/dist/InventoryPage-CPbzfDMR.js.map +0 -1
  61. package/dist/MemberProfileCard-0vjO3Gzd.js.map +0 -1
  62. package/dist/PaymentCreatePage-BYmDZAIB.js.map +0 -1
  63. package/dist/PickupCreatePage-CMGwoAXj.js +0 -426
  64. package/dist/PickupCreatePage-CMGwoAXj.js.map +0 -1
  65. package/dist/PickupsPage-D66_Wta4.js.map +0 -1
  66. package/dist/PmTable-B9970kPY.js.map +0 -1
  67. package/dist/ProductEditPage-B8qFTCW9.js.map +0 -1
  68. package/dist/PurchaseCreatePage-CDfNDcKG.js +0 -627
  69. package/dist/PurchaseCreatePage-CDfNDcKG.js.map +0 -1
  70. package/dist/PurchaseRequestDetailPage-C7aAwEqw.js.map +0 -1
  71. package/dist/SaleCreatePage-DP1Qmltu.js.map +0 -1
  72. package/dist/SalesPage-CO3cdYX5.js.map +0 -1
  73. package/dist/SettingsPage-DvVRwSFw.js +0 -711
  74. package/dist/SettingsPage-DvVRwSFw.js.map +0 -1
  75. package/dist/TransactionsPage-HKIGwEZN.js.map +0 -1
  76. package/dist/TransferCreatePage-DMuZqQ3c.js +0 -363
  77. package/dist/TransferCreatePage-DMuZqQ3c.js.map +0 -1
  78. package/dist/TransfersPage-COIyouL4.js +0 -480
  79. package/dist/TransfersPage-COIyouL4.js.map +0 -1
  80. package/dist/VialsPage-BNPUwGCU.js +0 -922
  81. package/dist/VialsPage-BNPUwGCU.js.map +0 -1
  82. package/dist/currency-ClRLIEg2.js +0 -1372
  83. package/dist/currency-ClRLIEg2.js.map +0 -1
@@ -1,19 +1,20 @@
1
- import { $ as e, i as t, n, o as r, r as i } from "./currency-ClRLIEg2.js";
2
- import { c as ee, i as te, s as ne, t as re } from "./PmTable-B9970kPY.js";
3
- import { n as a, r as o } from "./format-UOyOu75i.js";
4
- import { p as s, s as c } from "./constants-5ZCZo-Zm.js";
1
+ import { W as e } from "./settingsStore-KW217unV.js";
2
+ import { c as t, i as n, s as r, t as i } from "./PmTable-BkK65bJQ.js";
3
+ import { p as a, s as o } from "./constants-5ZCZo-Zm.js";
4
+ import { n as s, r as c } from "./format-UOyOu75i.js";
5
+ import { a as ee, n as te, r as ne, t as re } from "./PmGuard-C90yhpsN.js";
5
6
  import { useMemo as ie, useState as l } from "react";
6
7
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
8
  import { Alert as ae, Autocomplete as oe, Box as f, Button as p, Chip as m, FormControl as h, IconButton as g, InputLabel as _, MenuItem as v, Select as y, Skeleton as se, Stack as b, TableBody as ce, TableCell as x, TableHead as le, TableRow as S, TextField as C, Tooltip as w, Typography as T } from "@mui/material";
8
- import ue from "@mui/icons-material/RefreshRounded";
9
- import { showToast as E } from "@/common/toaster/toaster";
10
- import { alpha as D, useTheme as de } from "@mui/material/styles";
11
- import O from "@mui/icons-material/ShoppingCartRounded";
12
- import k from "@mui/icons-material/FactCheckRounded";
13
- import A from "@mui/icons-material/MoveDownRounded";
14
- import j from "@mui/icons-material/SwapHorizRounded";
15
- import M from "@mui/icons-material/PointOfSaleRounded";
16
- import N from "@mui/icons-material/VaccinesRounded";
9
+ import E from "@mui/icons-material/VaccinesRounded";
10
+ import { showToast as D } from "@/common/toaster/toaster";
11
+ import { alpha as O, useTheme as ue } from "@mui/material/styles";
12
+ import de from "@mui/icons-material/RefreshRounded";
13
+ import k from "@mui/icons-material/ShoppingCartRounded";
14
+ import A from "@mui/icons-material/FactCheckRounded";
15
+ import j from "@mui/icons-material/MoveDownRounded";
16
+ import M from "@mui/icons-material/SwapHorizRounded";
17
+ import N from "@mui/icons-material/PointOfSaleRounded";
17
18
  import P from "@mui/icons-material/PaymentsRounded";
18
19
  import fe from "@mui/icons-material/ReceiptLongRounded";
19
20
  import F from "@mui/icons-material/LockOpenRounded";
@@ -40,12 +41,12 @@ var U = {
40
41
  },
41
42
  VIAL_OPENED: {
42
43
  color: "info",
43
- icon: N,
44
+ icon: E,
44
45
  label: "Vial opened"
45
46
  },
46
47
  ADMINISTRATION: {
47
48
  color: "primary",
48
- icon: N,
49
+ icon: E,
49
50
  label: "Administration"
50
51
  },
51
52
  WASTAGE: {
@@ -60,7 +61,7 @@ var U = {
60
61
  },
61
62
  SALE: {
62
63
  color: "success",
63
- icon: M,
64
+ icon: N,
64
65
  label: "Sale"
65
66
  },
66
67
  PAYMENT: {
@@ -90,37 +91,37 @@ var U = {
90
91
  },
91
92
  TRANSFER_IN: {
92
93
  color: "default",
93
- icon: j,
94
+ icon: M,
94
95
  label: "Transfer in"
95
96
  },
96
97
  PICKUP_OUT: {
97
98
  color: "default",
98
- icon: A,
99
+ icon: j,
99
100
  label: "Pickup — out"
100
101
  },
101
102
  PICKUP_IN: {
102
103
  color: "default",
103
- icon: A,
104
+ icon: j,
104
105
  label: "Pickup — in"
105
106
  },
106
107
  TOPUP_OUT: {
107
108
  color: "default",
108
- icon: A,
109
+ icon: j,
109
110
  label: "Top-up — out"
110
111
  },
111
112
  TOPUP_IN: {
112
113
  color: "default",
113
- icon: A,
114
+ icon: j,
114
115
  label: "Top-up — in"
115
116
  },
116
117
  RETURN_OUT: {
117
118
  color: "default",
118
- icon: A,
119
+ icon: j,
119
120
  label: "Return — out"
120
121
  },
121
122
  RETURN_IN: {
122
123
  color: "default",
123
- icon: A,
124
+ icon: j,
124
125
  label: "Return — in"
125
126
  },
126
127
  PURCHASE_REQUEST_SUBMITTED: {
@@ -135,7 +136,7 @@ var U = {
135
136
  },
136
137
  PURCHASE_REQUEST_PARTIAL: {
137
138
  color: "warning",
138
- icon: k,
139
+ icon: A,
139
140
  label: "Request partial"
140
141
  },
141
142
  PURCHASE_REQUEST_REJECTED: {
@@ -152,7 +153,7 @@ var U = {
152
153
  function be({ type: e }) {
153
154
  let t = U[e] || {
154
155
  color: "default",
155
- icon: O,
156
+ icon: k,
156
157
  label: e
157
158
  }, n = t.icon;
158
159
  return /* @__PURE__ */ u(m, {
@@ -175,7 +176,7 @@ function xe({ status: e }) {
175
176
  let t = e === "COMPLETED" ? "success" : e === "FAILED" ? "error" : "warning";
176
177
  return /* @__PURE__ */ u(m, {
177
178
  size: "small",
178
- label: s(c, e),
179
+ label: a(o, e),
179
180
  color: t,
180
181
  variant: "outlined",
181
182
  sx: {
@@ -191,7 +192,7 @@ var W = Object.keys(U).map((e) => ({
191
192
  label: U[e].label
192
193
  }));
193
194
  function G() {
194
- let s = de(), c = ve(), m = ye(), [O, k] = l([]), [A, j] = l(0), [M, N] = l(0), [P, F] = l(50), [I, L] = l(!0), [R, z] = l(""), [B, V] = l({
195
+ let a = ue(), o = ve(), m = ye(), [E, k] = l([]), [A, j] = l(0), [M, N] = l(0), [P, F] = l(50), [I, L] = l(!0), [R, z] = l(""), [B, V] = l({
195
196
  dateFrom: "",
196
197
  dateTo: "",
197
198
  types: [],
@@ -213,7 +214,7 @@ function G() {
213
214
  k(i.content ?? []), j(i.totalElements ?? 0), N(i.page ?? 0), F(i.size ?? n);
214
215
  } catch (e) {
215
216
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to load ledger";
216
- z(t), E({
217
+ z(t), D({
217
218
  message: t,
218
219
  type: "error"
219
220
  });
@@ -221,10 +222,10 @@ function G() {
221
222
  L(!1);
222
223
  }
223
224
  }
224
- t("view.manage.productManagement.ledger", () => {
225
+ ne("view.manage.productManagement.ledger", () => {
225
226
  H(0, P, B);
226
227
  }, []);
227
- let G = A === 0 ? 0 : M * P + 1, K = M * P + O.length, q = P > 0 ? Math.ceil(A / P) : 0, J = B.dateFrom && B.dateTo && B.dateTo < B.dateFrom ? "To date cannot be before From date." : "";
228
+ let G = A === 0 ? 0 : M * P + 1, K = M * P + E.length, q = P > 0 ? Math.ceil(A / P) : 0, J = B.dateFrom && B.dateTo && B.dateTo < B.dateFrom ? "To date cannot be before From date." : "";
228
229
  function Y(e) {
229
230
  e.dateFrom && e.dateTo && e.dateTo < e.dateFrom || (V(e), H(0, P, e));
230
231
  }
@@ -260,30 +261,30 @@ function G() {
260
261
  "volume",
261
262
  "money",
262
263
  "notes"
263
- ], Q = ie(() => O.map((e) => ({
264
- time: e.transactionTime ? a(e.transactionTime) : "",
264
+ ], Q = ie(() => E.map((e) => ({
265
+ time: e.transactionTime ? s(e.transactionTime) : "",
265
266
  type: U[e.transactionType]?.label ?? e.transactionType ?? "",
266
267
  owner: `${e.ownerName ?? (e.ownerType === "USER" ? "Personal" : "Facility")} (${e.ownerType ?? "—"})`,
267
268
  product: e.productName ?? "",
268
269
  vaccine: e.vaccineCode ?? "",
269
270
  lot: e.lotNumber ?? "",
270
271
  qty: e.quantity ?? "",
271
- volume: e.volumeMl == null ? "" : `${o(e.volumeMl)} ml`,
272
- money: e.monetaryAmount == null ? "" : o(e.monetaryAmount),
272
+ volume: e.volumeMl == null ? "" : `${c(e.volumeMl)} ml`,
273
+ money: e.monetaryAmount == null ? "" : c(e.monetaryAmount),
273
274
  notes: e.notes ?? ""
274
- })), [O]);
275
+ })), [E]);
275
276
  function $(e) {
276
277
  return `pm-ledger-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:T]/g, "-").slice(0, 16)}.${e}`;
277
278
  }
278
279
  function Ce() {
279
280
  if (Q.length === 0) {
280
- E({
281
+ D({
281
282
  message: "Nothing to export on this page.",
282
283
  type: "info"
283
284
  });
284
285
  return;
285
286
  }
286
- c({
287
+ o({
287
288
  title: "PM Stock Ledger",
288
289
  columns: X,
289
290
  keys: Z,
@@ -296,7 +297,7 @@ function G() {
296
297
  }
297
298
  function we() {
298
299
  if (Q.length === 0) {
299
- E({
300
+ D({
300
301
  message: "Nothing to export on this page.",
301
302
  type: "info"
302
303
  });
@@ -309,9 +310,9 @@ function G() {
309
310
  filename: $("xlsx")
310
311
  });
311
312
  }
312
- return /* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(i, {}), /* @__PURE__ */ u(n, {
313
+ return /* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(te, {}), /* @__PURE__ */ u(re, {
313
314
  perm: "view.manage.productManagement.ledger",
314
- children: /* @__PURE__ */ d(r, {
315
+ children: /* @__PURE__ */ d(ee, {
315
316
  title: "Stock Ledger",
316
317
  subtitle: "Complete record of all stock and money movements. Balances always match this ledger.",
317
318
  actions: /* @__PURE__ */ d(b, {
@@ -322,19 +323,19 @@ function G() {
322
323
  variant: "outlined",
323
324
  startIcon: /* @__PURE__ */ u(ge, {}),
324
325
  onClick: Ce,
325
- disabled: I || O.length === 0,
326
+ disabled: I || E.length === 0,
326
327
  children: "PDF"
327
328
  }),
328
329
  /* @__PURE__ */ u(p, {
329
330
  variant: "outlined",
330
331
  startIcon: /* @__PURE__ */ u(_e, {}),
331
332
  onClick: we,
332
- disabled: I || O.length === 0,
333
+ disabled: I || E.length === 0,
333
334
  children: "Excel"
334
335
  }),
335
336
  /* @__PURE__ */ u(p, {
336
337
  variant: "outlined",
337
- startIcon: /* @__PURE__ */ u(ue, {}),
338
+ startIcon: /* @__PURE__ */ u(de, {}),
338
339
  onClick: () => void H(0, P, B),
339
340
  children: "Refresh"
340
341
  })
@@ -350,7 +351,7 @@ function G() {
350
351
  sx: {
351
352
  mb: 2,
352
353
  p: 2,
353
- borderRadius: 3,
354
+ borderRadius: 1.5,
354
355
  border: "1px solid",
355
356
  borderColor: "divider"
356
357
  },
@@ -477,7 +478,7 @@ function G() {
477
478
  ]
478
479
  })
479
480
  }),
480
- /* @__PURE__ */ u(ee, {
481
+ /* @__PURE__ */ u(t, {
481
482
  eyebrow: "Audit feed",
482
483
  title: "Transactions",
483
484
  subtitle: I ? "Loading…" : A === 0 ? "No transactions in this window" : `Showing ${G}–${K} of ${A} · page ${M + 1} of ${q}`,
@@ -555,7 +556,7 @@ function G() {
555
556
  })
556
557
  ]
557
558
  }),
558
- children: /* @__PURE__ */ d(ne, {
559
+ children: /* @__PURE__ */ d(r, {
559
560
  dense: !0,
560
561
  children: [/* @__PURE__ */ u(le, { children: /* @__PURE__ */ d(S, { children: [
561
562
  /* @__PURE__ */ u(x, { children: "Time" }),
@@ -576,12 +577,12 @@ function G() {
576
577
  }),
577
578
  /* @__PURE__ */ u(x, { children: "Sync" }),
578
579
  /* @__PURE__ */ u(x, { children: "Notes" })
579
- ] }) }), /* @__PURE__ */ u(ce, { children: I ? Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ u(S, { children: Array.from({ length: 9 }).map((e, t) => /* @__PURE__ */ u(x, { children: /* @__PURE__ */ u(se, { height: 22 }) }, t)) }, t)) : O.length === 0 ? /* @__PURE__ */ u(re, {
580
+ ] }) }), /* @__PURE__ */ u(ce, { children: I ? Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ u(S, { children: Array.from({ length: 9 }).map((e, t) => /* @__PURE__ */ u(x, { children: /* @__PURE__ */ u(se, { height: 22 }) }, t)) }, t)) : E.length === 0 ? /* @__PURE__ */ u(i, {
580
581
  colSpan: 9,
581
582
  icon: fe,
582
583
  title: "No transactions in this window",
583
584
  hint: "Record a purchase, sale, vial open, or payment. Every stock and money movement lands here."
584
- }) : O.map((e) => /* @__PURE__ */ d(S, {
585
+ }) : E.map((e) => /* @__PURE__ */ d(S, {
585
586
  hover: !0,
586
587
  children: [
587
588
  /* @__PURE__ */ u(x, { children: /* @__PURE__ */ u(T, {
@@ -590,7 +591,7 @@ function G() {
590
591
  fontWeight: 700,
591
592
  lineHeight: 1.2
592
593
  },
593
- children: a(e.transactionTime)
594
+ children: s(e.transactionTime)
594
595
  }) }),
595
596
  /* @__PURE__ */ u(x, { children: /* @__PURE__ */ u(be, { type: e.transactionType }) }),
596
597
  /* @__PURE__ */ d(x, { children: [/* @__PURE__ */ u(T, {
@@ -623,7 +624,7 @@ function G() {
623
624
  px: .6,
624
625
  py: .05,
625
626
  borderRadius: 1,
626
- bgcolor: D(s.palette.info.main, .1),
627
+ bgcolor: O(a.palette.info.main, .1),
627
628
  color: "info.dark",
628
629
  fontFamily: "monospace",
629
630
  fontSize: "0.65rem",
@@ -638,7 +639,7 @@ function G() {
638
639
  px: .7,
639
640
  py: .1,
640
641
  borderRadius: 1,
641
- bgcolor: D(s.palette.primary.main, .06),
642
+ bgcolor: O(a.palette.primary.main, .06),
642
643
  color: "primary.dark",
643
644
  fontFamily: "monospace",
644
645
  fontSize: "0.7rem",
@@ -675,12 +676,12 @@ function G() {
675
676
  fontWeight: 700,
676
677
  fontVariantNumeric: "tabular-nums"
677
678
  },
678
- children: [o(e.volumeMl), " ml"]
679
+ children: [c(e.volumeMl), " ml"]
679
680
  })
680
681
  }),
681
682
  /* @__PURE__ */ u(x, {
682
683
  align: "right",
683
- children: /* @__PURE__ */ u(te, { value: e.monetaryAmount })
684
+ children: /* @__PURE__ */ u(n, { value: e.monetaryAmount })
684
685
  }),
685
686
  /* @__PURE__ */ u(x, { children: /* @__PURE__ */ u(xe, { status: e.syncStatus }) }),
686
687
  /* @__PURE__ */ u(x, {
@@ -715,4 +716,4 @@ function G() {
715
716
  //#endregion
716
717
  export { G as default };
717
718
 
718
- //# sourceMappingURL=TransactionsPage-HKIGwEZN.js.map
719
+ //# sourceMappingURL=TransactionsPage-Cocn4901.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransactionsPage-Cocn4901.js","names":[],"sources":["../src/views/TransactionsPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Chip,\n FormControl,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport ReceiptLongRoundedIcon from '@mui/icons-material/ReceiptLongRounded';\nimport ChevronLeftRoundedIcon from '@mui/icons-material/ChevronLeftRounded';\nimport ChevronRightRoundedIcon from '@mui/icons-material/ChevronRightRounded';\nimport CallMadeRoundedIcon from '@mui/icons-material/CallMadeRounded';\nimport CallReceivedRoundedIcon from '@mui/icons-material/CallReceivedRounded';\nimport SwapHorizRoundedIcon from '@mui/icons-material/SwapHorizRounded';\nimport VaccinesRoundedIcon from '@mui/icons-material/VaccinesRounded';\nimport ShoppingCartRoundedIcon from '@mui/icons-material/ShoppingCartRounded';\nimport PointOfSaleRoundedIcon from '@mui/icons-material/PointOfSaleRounded';\nimport PaymentsRoundedIcon from '@mui/icons-material/PaymentsRounded';\nimport ReportRoundedIcon from '@mui/icons-material/ReportRounded';\nimport BlockRoundedIcon from '@mui/icons-material/BlockRounded';\nimport LockOpenRoundedIcon from '@mui/icons-material/LockOpenRounded';\nimport MoveDownRoundedIcon from '@mui/icons-material/MoveDownRounded';\nimport FactCheckRoundedIcon from '@mui/icons-material/FactCheckRounded';\nimport CancelRoundedIcon from '@mui/icons-material/CancelRounded';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport HourglassEmptyRoundedIcon from '@mui/icons-material/HourglassEmptyRounded';\nimport SearchRoundedIcon from '@mui/icons-material/SearchRounded';\nimport PictureAsPdfRoundedIcon from '@mui/icons-material/PictureAsPdfRounded';\nimport InsertDriveFileRoundedIcon from '@mui/icons-material/InsertDriveFileRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport useDownloadPdf from '@/hooks/useDownloadPdf';\nimport { useDownloadXlsx } from '@/hooks/useDownloadXlsx';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect } from '@pm/utils/permissions';\nimport {\n PmEmptyRow,\n PmMoney,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport { queryTransactions } from '@pm/services/pmApi';\nimport { formatDateTime, formatNumber } from '@pm/utils/format';\nimport { SYNC_STATUSES, labelOf } from '@pm/utils/constants';\n\n// Per-type visual: chip colour + icon. The icon turns the type column from a\n// flat text label into something the operator can scan with peripheral vision.\nconst TYPE_META = {\n RECEIPT: { color: 'success', icon: CallReceivedRoundedIcon, label: 'Receipt' },\n VIAL_OPENED: { color: 'info', icon: VaccinesRoundedIcon, label: 'Vial opened' },\n ADMINISTRATION: { color: 'primary', icon: VaccinesRoundedIcon, label: 'Administration' },\n WASTAGE: { color: 'warning', icon: ReportRoundedIcon, label: 'Wastage' },\n EXPIRY: { color: 'warning', icon: ReportRoundedIcon, label: 'Expiry' },\n SALE: { color: 'success', icon: PointOfSaleRoundedIcon, label: 'Sale' },\n PAYMENT: { color: 'success', icon: PaymentsRoundedIcon, label: 'Payment' },\n QUARANTINE: { color: 'error', icon: BlockRoundedIcon, label: 'Quarantine' },\n RECALL: { color: 'error', icon: BlockRoundedIcon, label: 'Recall' },\n UNQUARANTINE: { color: 'info', icon: LockOpenRoundedIcon, label: 'Unquarantine' },\n TRANSFER_OUT: { color: 'default', icon: CallMadeRoundedIcon, label: 'Transfer out' },\n TRANSFER_IN: { color: 'default', icon: SwapHorizRoundedIcon, label: 'Transfer in' },\n PICKUP_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Pickup — out' },\n PICKUP_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Pickup — in' },\n TOPUP_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Top-up — out' },\n TOPUP_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Top-up — in' },\n RETURN_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Return — out' },\n RETURN_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Return — in' },\n PURCHASE_REQUEST_SUBMITTED: { color: 'info', icon: HourglassEmptyRoundedIcon, label: 'Request submitted' },\n PURCHASE_REQUEST_APPROVED: { color: 'success', icon: CheckCircleRoundedIcon, label: 'Request approved' },\n PURCHASE_REQUEST_PARTIAL: { color: 'warning', icon: FactCheckRoundedIcon, label: 'Request partial' },\n PURCHASE_REQUEST_REJECTED: { color: 'error', icon: CancelRoundedIcon, label: 'Request rejected' },\n PURCHASE_REQUEST_CANCELLED: { color: 'default', icon: CancelRoundedIcon, label: 'Request cancelled' },\n};\n\nfunction TypeChip({ type }) {\n const meta = TYPE_META[type] || { color: 'default', icon: ShoppingCartRoundedIcon, label: type };\n const Icon = meta.icon;\n return (\n <Chip\n size=\"small\"\n color={meta.color}\n icon={<Icon sx={{ fontSize: '1rem !important' }} />}\n label={meta.label}\n sx={{\n fontWeight: 700,\n height: 24,\n borderRadius: 1.5,\n '& .MuiChip-icon': { ml: 0.75, mr: -0.25 },\n }}\n />\n );\n}\n\nfunction SyncChip({ status }) {\n const color = status === 'COMPLETED' ? 'success' : status === 'FAILED' ? 'error' : 'warning';\n return (\n <Chip\n size=\"small\"\n label={labelOf(SYNC_STATUSES, status)}\n color={color}\n variant=\"outlined\"\n sx={{ fontWeight: 700, height: 22, borderRadius: 1.5, fontSize: '0.7rem' }}\n />\n );\n}\n\n// Type options for the filter Autocomplete — pulled from TYPE_META so any\n// new types automatically show up in the dropdown without extra wiring.\nconst TYPE_OPTIONS = Object.keys(TYPE_META).map((value) => ({\n value,\n label: TYPE_META[value].label,\n}));\n\nexport default function TransactionsPage() {\n const theme = useTheme();\n const downloadPdf = useDownloadPdf();\n const downloadXlsx = useDownloadXlsx();\n const [items, setItems] = useState([]);\n const [totalElements, setTotalElements] = useState(0);\n const [page, setPage] = useState(0);\n const [pageSize, setPageSize] = useState(50);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n // Filter state — fed into the query on every load. The \"applied\" snapshot\n // is what was last submitted; the \"draft\" version is the in-progress\n // values bound to the inputs so typing doesn't fire a request per\n // keystroke.\n const [filters, setFilters] = useState({\n dateFrom: '', dateTo: '', types: [], search: '', ownerType: '',\n });\n\n async function load(p = page, size = pageSize, f = filters) {\n setLoading(true);\n setError('');\n try {\n const data = await queryTransactions({\n page: p,\n size,\n dateFrom: f.dateFrom ? new Date(f.dateFrom).toISOString() : undefined,\n // Inclusive end-of-day: send the end timestamp at 23:59:59 so the\n // user's \"today\" filter captures everything that happened today.\n dateTo: f.dateTo ? new Date(`${f.dateTo}T23:59:59`).toISOString() : undefined,\n types: f.types.length > 0 ? f.types : undefined,\n ownerType: f.ownerType || undefined,\n search: f.search?.trim() || undefined,\n });\n setItems(data.content ?? []);\n setTotalElements(data.totalElements ?? 0);\n setPage(data.page ?? 0);\n setPageSize(data.size ?? size);\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load ledger';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.ledger', () => {\n void load(0, pageSize, filters);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const startIdx = totalElements === 0 ? 0 : page * pageSize + 1;\n const endIdx = page * pageSize + items.length;\n const totalPages = pageSize > 0 ? Math.ceil(totalElements / pageSize) : 0;\n\n // ISO yyyy-mm-dd strings compare lexicographically, so a plain string compare\n // is enough to catch a To date that lands before the From date.\n const dateRangeError = filters.dateFrom && filters.dateTo && filters.dateTo < filters.dateFrom\n ? 'To date cannot be before From date.'\n : '';\n\n function applyFilters(next) {\n if (next.dateFrom && next.dateTo && next.dateTo < next.dateFrom) return;\n setFilters(next);\n void load(0, pageSize, next);\n }\n\n function resetFilters() {\n const blank = { dateFrom: '', dateTo: '', types: [], search: '', ownerType: '' };\n setFilters(blank);\n void load(0, pageSize, blank);\n }\n\n // Flatten the current page into a column-mapped shape the download\n // hooks can consume. Strings only — both hooks call toString() on values\n // for cell rendering, so we pre-format here so the file matches the UI.\n const exportColumns = ['Time', 'Type', 'Owner', 'Product', 'Vaccine', 'Lot', 'Qty', 'Volume', 'Money', 'Notes'];\n const exportKeys = ['time', 'type', 'owner', 'product', 'vaccine', 'lot', 'qty', 'volume', 'money', 'notes'];\n const exportData = useMemo(() => items.map((t) => ({\n time: t.transactionTime ? formatDateTime(t.transactionTime) : '',\n type: TYPE_META[t.transactionType]?.label ?? t.transactionType ?? '',\n owner: `${t.ownerName ?? (t.ownerType === 'USER' ? 'Personal' : 'Facility')} (${t.ownerType ?? '—'})`,\n product: t.productName ?? '',\n vaccine: t.vaccineCode ?? '',\n lot: t.lotNumber ?? '',\n qty: t.quantity ?? '',\n volume: t.volumeMl != null ? `${formatNumber(t.volumeMl)} ml` : '',\n money: t.monetaryAmount != null ? formatNumber(t.monetaryAmount) : '',\n notes: t.notes ?? '',\n })), [items]);\n\n function buildFileName(extension) {\n const stamp = new Date().toISOString().replace(/[:T]/g, '-').slice(0, 16);\n return `pm-ledger-${stamp}.${extension}`;\n }\n\n function doDownloadPdf() {\n if (exportData.length === 0) {\n showToast({ message: 'Nothing to export on this page.', type: 'info' });\n return;\n }\n downloadPdf({\n title: 'PM Stock Ledger',\n columns: exportColumns,\n keys: exportKeys,\n data: exportData,\n fileName: buildFileName('pdf'),\n headerText: 'Product Management — Stock Ledger',\n footerText: 'Generated by MEDplat PM',\n orientation: 'landscape',\n });\n }\n\n function doDownloadXlsx() {\n if (exportData.length === 0) {\n showToast({ message: 'Nothing to export on this page.', type: 'info' });\n return;\n }\n void downloadXlsx({\n columns: exportColumns,\n keys: exportKeys,\n data: exportData,\n filename: buildFileName('xlsx'),\n });\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.ledger'}>\n <PmPageShell\n title=\"Stock Ledger\"\n subtitle=\"Complete record of all stock and money movements. Balances always match this ledger.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<PictureAsPdfRoundedIcon />} onClick={doDownloadPdf} disabled={loading || items.length === 0}>PDF</Button>\n <Button variant=\"outlined\" startIcon={<InsertDriveFileRoundedIcon />} onClick={doDownloadXlsx} disabled={loading || items.length === 0}>Excel</Button>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load(0, pageSize, filters)}>Refresh</Button>\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n {/* ---------- Filter panel ---------- */}\n <Box sx={{ mb: 2, p: 2, borderRadius: 1.5, border: '1px solid', borderColor: 'divider' }}>\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} alignItems={{ md: 'center' }}>\n <TextField\n size=\"small\" type=\"date\" label=\"From\"\n InputLabelProps={{ shrink: true }}\n value={filters.dateFrom}\n onChange={(e) => setFilters((f) => ({ ...f, dateFrom: e.target.value }))}\n inputProps={{ max: filters.dateTo || undefined }}\n sx={{ minWidth: 160 }}\n />\n <TextField\n size=\"small\" type=\"date\" label=\"To\"\n InputLabelProps={{ shrink: true }}\n value={filters.dateTo}\n onChange={(e) => setFilters((f) => ({ ...f, dateTo: e.target.value }))}\n inputProps={{ min: filters.dateFrom || undefined }}\n error={!!dateRangeError}\n helperText={dateRangeError || undefined}\n sx={{ minWidth: 160 }}\n />\n <Autocomplete\n size=\"small\" multiple disableCloseOnSelect\n options={TYPE_OPTIONS}\n getOptionLabel={(o) => o.label}\n isOptionEqualToValue={(a, b) => a.value === b.value}\n value={TYPE_OPTIONS.filter((o) => filters.types.includes(o.value))}\n onChange={(_, next) => setFilters((f) => ({ ...f, types: next.map((o) => o.value) }))}\n renderInput={(params) => <TextField {...params} label=\"Types\" placeholder=\"Any\" />}\n sx={{ minWidth: 240, flexGrow: 1 }}\n />\n <FormControl size=\"small\" sx={{ minWidth: 140 }}>\n <InputLabel>Owner</InputLabel>\n <Select label=\"Owner\" value={filters.ownerType}\n onChange={(e) => setFilters((f) => ({ ...f, ownerType: e.target.value }))}>\n <MenuItem value=\"\">Any</MenuItem>\n <MenuItem value=\"FACILITY\">Facility</MenuItem>\n <MenuItem value=\"USER\">Personal</MenuItem>\n </Select>\n </FormControl>\n <TextField\n size=\"small\" label=\"Search\"\n placeholder=\"Lot, vaccine code, notes…\"\n value={filters.search}\n onChange={(e) => setFilters((f) => ({ ...f, search: e.target.value }))}\n onKeyDown={(e) => { if (e.key === 'Enter') applyFilters(filters); }}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{ startAdornment: <SearchRoundedIcon fontSize=\"small\" sx={{ color: 'text.secondary', mr: 1 }} /> }}\n />\n <Button variant=\"contained\" onClick={() => applyFilters(filters)} disabled={loading || !!dateRangeError}>Apply</Button>\n <Button variant=\"text\" onClick={resetFilters} disabled={loading}>Clear</Button>\n </Stack>\n </Box>\n\n <PmTableCard\n eyebrow=\"Audit feed\"\n title=\"Transactions\"\n subtitle={loading\n ? 'Loading…'\n : totalElements === 0\n ? 'No transactions in this window'\n : `Showing ${startIdx}–${endIdx} of ${totalElements} · page ${page + 1} of ${totalPages}`}\n actions={\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\">\n <FormControl size=\"small\" variant=\"outlined\" sx={{ minWidth: 88, mr: 1 }}>\n <InputLabel>Size</InputLabel>\n <Select label=\"Size\" value={pageSize}\n onChange={(e) => { const v = Number(e.target.value); setPageSize(v); void load(0, v, filters); }}>\n {[25, 50, 100, 200].map((s) => <MenuItem key={s} value={s}>{s}</MenuItem>)}\n </Select>\n </FormControl>\n <Tooltip title=\"Previous page\">\n <span>\n <IconButton\n size=\"small\"\n disabled={page === 0 || loading}\n onClick={() => void load(page - 1, pageSize, filters)}\n sx={{ border: '1px solid', borderColor: 'divider' }}\n >\n <ChevronLeftRoundedIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n <Box sx={{ px: 1, minWidth: 64, textAlign: 'center' }}>\n <Typography variant=\"caption\" sx={{ fontWeight: 800, color: 'text.secondary', fontVariantNumeric: 'tabular-nums' }}>\n {totalElements === 0 ? '—' : `${startIdx}–${endIdx}`}\n </Typography>\n </Box>\n <Tooltip title=\"Next page\">\n <span>\n <IconButton\n size=\"small\"\n disabled={page + 1 >= totalPages || loading}\n onClick={() => void load(page + 1, pageSize, filters)}\n sx={{ border: '1px solid', borderColor: 'divider' }}\n >\n <ChevronRightRoundedIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n </Stack>\n }\n >\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Time</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Owner</TableCell>\n <TableCell>Product · Lot</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell align=\"right\">Volume</TableCell>\n <TableCell align=\"right\">Money</TableCell>\n <TableCell>Sync</TableCell>\n <TableCell>Notes</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 6 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 9 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <PmEmptyRow\n colSpan={9}\n icon={ReceiptLongRoundedIcon}\n title=\"No transactions in this window\"\n hint=\"Record a purchase, sale, vial open, or payment. Every stock and money movement lands here.\"\n />\n ) : items.map((t) => (\n <TableRow key={t.id} hover>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, lineHeight: 1.2 }}>\n {formatDateTime(t.transactionTime)}\n </Typography>\n </TableCell>\n <TableCell><TypeChip type={t.transactionType} /></TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {t.ownerName || (t.ownerType === 'USER' ? 'Personal' : 'Facility')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t.ownerType}\n </Typography>\n </TableCell>\n <TableCell>\n <Stack direction=\"row\" alignItems=\"baseline\" spacing={1} sx={{ minWidth: 0 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, lineHeight: 1.2 }} noWrap>\n {t.productName || '—'}\n </Typography>\n {t.vaccineCode ? (\n <Box\n component=\"span\"\n sx={{\n px: 0.6,\n py: 0.05,\n borderRadius: 1,\n bgcolor: alpha(theme.palette.info.main, 0.1),\n color: 'info.dark',\n fontFamily: 'monospace',\n fontSize: '0.65rem',\n fontWeight: 700,\n }}\n >\n {t.vaccineCode}\n </Box>\n ) : null}\n {t.lotNumber ? (\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n px: 0.7,\n py: 0.1,\n borderRadius: 1,\n bgcolor: alpha(theme.palette.primary.main, 0.06),\n color: 'primary.dark',\n fontFamily: 'monospace',\n fontSize: '0.7rem',\n fontWeight: 700,\n }}\n >\n {t.lotNumber}\n </Box>\n ) : null}\n </Stack>\n </TableCell>\n <TableCell align=\"right\">\n {t.quantity != null\n ? <Typography variant=\"body2\" sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{t.quantity}</Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell align=\"right\">\n {t.volumeMl != null\n ? <Typography variant=\"body2\" sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{formatNumber(t.volumeMl)} ml</Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney value={t.monetaryAmount} />\n </TableCell>\n <TableCell><SyncChip status={t.syncStatus} /></TableCell>\n <TableCell sx={{ maxWidth: 240 }}>\n {t.notes ? (\n <Tooltip title={t.notes}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.notes}\n </Typography>\n </Tooltip>\n ) : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}