@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
@@ -0,0 +1,471 @@
1
+ import { B as e, O as t, T as n, c as r, o as i } from "./settingsStore-KW217unV.js";
2
+ import { a, c as ee, o as te, s as ne, t as re } from "./PmTable-BkK65bJQ.js";
3
+ import { c as ie, p as ae } from "./constants-5ZCZo-Zm.js";
4
+ import { n as oe, t as o } from "./format-UOyOu75i.js";
5
+ import { a as se, i as ce, n as le, r as ue, t as de } from "./PmGuard-C90yhpsN.js";
6
+ import { useMemo as s, useState as c } from "react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { Alert as d, Box as f, Button as p, Chip as fe, Dialog as m, DialogActions as pe, DialogContent as me, DialogTitle as h, InputAdornment as he, Skeleton as ge, Stack as g, Tab as _, TableBody as _e, TableCell as v, TableHead as ve, TableRow as y, Tabs as ye, TextField as b, Typography as x } from "@mui/material";
9
+ import { showToast as S } from "@/common/toaster/toaster";
10
+ import { alpha as C } from "@mui/material/styles";
11
+ import w from "@mui/icons-material/AddRounded";
12
+ import be from "@mui/icons-material/RefreshRounded";
13
+ import { useNavigate as xe } from "react-router-dom";
14
+ import Se from "@mui/icons-material/SwapHorizRounded";
15
+ import Ce from "@mui/icons-material/SearchRounded";
16
+ import T from "@mui/icons-material/CheckCircleRounded";
17
+ import E from "@mui/icons-material/DoNotDisturbRounded";
18
+ //#region src/views/TransfersPage.jsx
19
+ function we(e) {
20
+ switch (e) {
21
+ case "PENDING": return "info";
22
+ case "COMPLETED": return "success";
23
+ case "CANCELLED": return "default";
24
+ default: return "default";
25
+ }
26
+ }
27
+ function D() {
28
+ let D = xe(), O = ce().has("update.manage.productManagement.transfer"), [k, Te] = c([]), [A, Ee] = c([]), [j, De] = c(() => /* @__PURE__ */ new Set()), [M, N] = c(!0), [P, F] = c(""), [I, Oe] = c("all"), [L, ke] = c(""), [R, z] = c({
29
+ open: !1,
30
+ transfer: null
31
+ }), [B, V] = c({
32
+ destStorageUnitId: "",
33
+ notes: ""
34
+ }), [H, U] = c({
35
+ open: !1,
36
+ transfer: null
37
+ }), [W, G] = c(""), [K, q] = c(!1);
38
+ async function J() {
39
+ N(!0), F("");
40
+ try {
41
+ let [r, i, a] = await Promise.all([
42
+ e(),
43
+ n({ activeOnly: !0 }).catch(() => []),
44
+ t().catch(() => [])
45
+ ]);
46
+ Te(r), Ee(i), De(new Set(a.map((e) => e.id)));
47
+ } catch (e) {
48
+ let t = e?.response?.data?.message ?? e?.message ?? "Failed to load transfers";
49
+ F(t), S({
50
+ message: t,
51
+ type: "error"
52
+ });
53
+ } finally {
54
+ N(!1);
55
+ }
56
+ }
57
+ ue("view.manage.productManagement.transfer", () => {
58
+ J();
59
+ }, []);
60
+ let Y = s(() => ({
61
+ incoming: k.filter((e) => e.status === "PENDING").length,
62
+ outgoing: k.filter((e) => e.status === "PENDING").length
63
+ }), [k]), X = s(() => {
64
+ let e = k;
65
+ I === "incoming" && (e = e.filter((e) => e.status === "PENDING")), I === "outgoing" && (e = e.filter((e) => e.status === "PENDING"));
66
+ let t = L.trim().toLowerCase();
67
+ return t && (e = e.filter((e) => `${e.productName ?? ""} ${e.sourceFacilityName ?? ""} ${e.destFacilityName ?? ""} ${e.lotNumber ?? ""} ${e.notes ?? ""}`.toLowerCase().includes(t))), e;
68
+ }, [
69
+ k,
70
+ I,
71
+ L
72
+ ]);
73
+ function Ae(e) {
74
+ V({
75
+ destStorageUnitId: e.destStorageUnitId ?? "",
76
+ notes: ""
77
+ }), z({
78
+ open: !0,
79
+ transfer: e
80
+ });
81
+ }
82
+ function Z() {
83
+ K || z({
84
+ open: !1,
85
+ transfer: null
86
+ });
87
+ }
88
+ function je(e) {
89
+ G(""), U({
90
+ open: !0,
91
+ transfer: e
92
+ });
93
+ }
94
+ function Q() {
95
+ K || U({
96
+ open: !1,
97
+ transfer: null
98
+ });
99
+ }
100
+ let $ = s(() => R.transfer ? A.filter((e) => e.ownerId === R.transfer.destFacilityId) : [], [A, R.transfer]);
101
+ async function Me() {
102
+ if (R.transfer) {
103
+ q(!0);
104
+ try {
105
+ await r(R.transfer.id, {
106
+ destStorageUnitId: B.destStorageUnitId || null,
107
+ notes: B.notes || null
108
+ }), S({
109
+ message: "Transfer confirmed — stock landed at the destination.",
110
+ type: "success"
111
+ }), Z(), await J();
112
+ } catch (e) {
113
+ S({
114
+ message: e?.response?.data?.message ?? e?.message ?? "Failed to confirm transfer",
115
+ type: "error"
116
+ });
117
+ } finally {
118
+ q(!1);
119
+ }
120
+ }
121
+ }
122
+ async function Ne() {
123
+ if (H.transfer) {
124
+ q(!0);
125
+ try {
126
+ await i(H.transfer.id, { notes: W || null }), S({
127
+ message: "Transfer cancelled — stock returned to the source.",
128
+ type: "success"
129
+ }), Q(), await J();
130
+ } catch (e) {
131
+ S({
132
+ message: e?.response?.data?.message ?? e?.message ?? "Failed to cancel transfer",
133
+ type: "error"
134
+ });
135
+ } finally {
136
+ q(!1);
137
+ }
138
+ }
139
+ }
140
+ return /* @__PURE__ */ u(f, { children: [
141
+ /* @__PURE__ */ l(le, {}),
142
+ /* @__PURE__ */ l(de, {
143
+ perm: "view.manage.productManagement.transfer",
144
+ children: /* @__PURE__ */ u(se, {
145
+ title: "Stock Transfers",
146
+ subtitle: "Stock movements between facilities. The sender loses stock when shipping. The receiver gains it when they confirm.",
147
+ actions: /* @__PURE__ */ u(g, {
148
+ direction: "row",
149
+ spacing: 1,
150
+ children: [/* @__PURE__ */ l(p, {
151
+ variant: "outlined",
152
+ startIcon: /* @__PURE__ */ l(be, {}),
153
+ onClick: () => void J(),
154
+ children: "Refresh"
155
+ }), O ? /* @__PURE__ */ l(p, {
156
+ variant: "contained",
157
+ startIcon: /* @__PURE__ */ l(w, {}),
158
+ onClick: () => D("/ui/medplat/manage/pm/transfers/new"),
159
+ children: "New Transfer"
160
+ }) : null]
161
+ }),
162
+ children: [P ? /* @__PURE__ */ l(d, {
163
+ severity: "error",
164
+ sx: { mb: 2 },
165
+ children: P
166
+ }) : null, /* @__PURE__ */ u(ee, {
167
+ eyebrow: "Operations",
168
+ title: "Transfers",
169
+ subtitle: M ? "Loading…" : `${X.length} ${X.length === 1 ? "transfer" : "transfers"}`,
170
+ children: [/* @__PURE__ */ u(g, {
171
+ direction: {
172
+ xs: "column",
173
+ md: "row"
174
+ },
175
+ spacing: 1.5,
176
+ sx: { mb: 2 },
177
+ alignItems: { md: "center" },
178
+ children: [
179
+ /* @__PURE__ */ u(ye, {
180
+ value: I,
181
+ onChange: (e, t) => Oe(t),
182
+ sx: { minHeight: 40 },
183
+ children: [/* @__PURE__ */ l(_, {
184
+ value: "all",
185
+ label: `All${k.length ? ` (${k.length})` : ""}`,
186
+ sx: {
187
+ minHeight: 40,
188
+ textTransform: "none",
189
+ fontWeight: 700
190
+ }
191
+ }), /* @__PURE__ */ l(_, {
192
+ value: "incoming",
193
+ label: `Pending${Y.incoming ? ` (${Y.incoming})` : ""}`,
194
+ sx: {
195
+ minHeight: 40,
196
+ textTransform: "none",
197
+ fontWeight: 700
198
+ }
199
+ })]
200
+ }),
201
+ /* @__PURE__ */ l(f, { sx: { flexGrow: 1 } }),
202
+ /* @__PURE__ */ l(b, {
203
+ size: "small",
204
+ fullWidth: !0,
205
+ placeholder: "Search by product, facility, lot, notes…",
206
+ value: L,
207
+ onChange: (e) => ke(e.target.value),
208
+ sx: { maxWidth: { md: 360 } },
209
+ InputProps: { startAdornment: /* @__PURE__ */ l(he, {
210
+ position: "start",
211
+ children: /* @__PURE__ */ l(Ce, { fontSize: "small" })
212
+ }) }
213
+ })
214
+ ]
215
+ }), /* @__PURE__ */ u(ne, {
216
+ dense: !0,
217
+ children: [/* @__PURE__ */ l(ve, { children: /* @__PURE__ */ u(y, { children: [
218
+ /* @__PURE__ */ l(v, { children: "Ref" }),
219
+ /* @__PURE__ */ l(v, { children: "Product" }),
220
+ /* @__PURE__ */ l(v, { children: "From" }),
221
+ /* @__PURE__ */ l(v, { children: "To" }),
222
+ /* @__PURE__ */ l(v, {
223
+ align: "right",
224
+ children: "Qty"
225
+ }),
226
+ /* @__PURE__ */ l(v, { children: "Shipped" }),
227
+ /* @__PURE__ */ l(v, { children: "Status" }),
228
+ /* @__PURE__ */ l(v, {
229
+ align: "right",
230
+ children: "Action"
231
+ })
232
+ ] }) }), /* @__PURE__ */ l(_e, { children: M ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ l(y, { children: Array.from({ length: 8 }).map((e, t) => /* @__PURE__ */ l(v, { children: /* @__PURE__ */ l(ge, { height: 22 }) }, t)) }, t)) : X.length === 0 ? /* @__PURE__ */ l(re, {
233
+ colSpan: 8,
234
+ icon: Se,
235
+ title: L.trim() === "" ? I === "incoming" ? "No pending transfers" : "No transfers yet" : "No transfers match your search",
236
+ hint: "Create a transfer to move stock between facilities.",
237
+ action: O ? /* @__PURE__ */ l(p, {
238
+ variant: "contained",
239
+ size: "small",
240
+ startIcon: /* @__PURE__ */ l(w, {}),
241
+ onClick: () => D("/ui/medplat/manage/pm/transfers/new"),
242
+ children: "Ship first transfer"
243
+ }) : null
244
+ }) : X.map((e) => /* @__PURE__ */ u(y, {
245
+ hover: !0,
246
+ children: [
247
+ /* @__PURE__ */ l(v, { children: /* @__PURE__ */ l(a, { id: e.serialId }) }),
248
+ /* @__PURE__ */ u(v, { children: [/* @__PURE__ */ l(x, {
249
+ variant: "body2",
250
+ sx: { fontWeight: 700 },
251
+ children: e.productName ?? "—"
252
+ }), e.lotNumber ? /* @__PURE__ */ l(x, {
253
+ variant: "caption",
254
+ sx: {
255
+ fontFamily: "monospace",
256
+ color: "text.secondary"
257
+ },
258
+ children: e.lotNumber
259
+ }) : null] }),
260
+ /* @__PURE__ */ l(v, { children: e.sourceFacilityName ?? "—" }),
261
+ /* @__PURE__ */ l(v, { children: e.destFacilityName ?? "—" }),
262
+ /* @__PURE__ */ l(v, {
263
+ align: "right",
264
+ children: /* @__PURE__ */ l(x, {
265
+ sx: {
266
+ fontWeight: 700,
267
+ fontVariantNumeric: "tabular-nums"
268
+ },
269
+ children: e.qty
270
+ })
271
+ }),
272
+ /* @__PURE__ */ u(v, { children: [/* @__PURE__ */ l(x, {
273
+ variant: "body2",
274
+ children: o(e.shippedOn)
275
+ }), /* @__PURE__ */ l(x, {
276
+ variant: "caption",
277
+ color: "text.secondary",
278
+ children: e.shippedByName ?? `#${e.shippedBy}`
279
+ })] }),
280
+ /* @__PURE__ */ l(v, { children: /* @__PURE__ */ l(fe, {
281
+ size: "small",
282
+ label: ae(ie, e.status),
283
+ color: we(e.status)
284
+ }) }),
285
+ /* @__PURE__ */ l(v, {
286
+ align: "right",
287
+ children: (() => {
288
+ if (e.status !== "PENDING" || !O) return /* @__PURE__ */ l(x, {
289
+ variant: "caption",
290
+ color: "text.disabled",
291
+ children: "—"
292
+ });
293
+ let t = j.has(e.destFacilityId), n = j.has(e.sourceFacilityId);
294
+ return !t && !n ? /* @__PURE__ */ l(x, {
295
+ variant: "caption",
296
+ color: "text.disabled",
297
+ children: "—"
298
+ }) : /* @__PURE__ */ u(g, {
299
+ direction: "row",
300
+ spacing: 1,
301
+ justifyContent: "flex-end",
302
+ children: [t ? /* @__PURE__ */ l(p, {
303
+ size: "small",
304
+ variant: "outlined",
305
+ startIcon: /* @__PURE__ */ l(T, {}),
306
+ onClick: () => Ae(e),
307
+ children: "Confirm"
308
+ }) : null, n ? /* @__PURE__ */ l(p, {
309
+ size: "small",
310
+ variant: "outlined",
311
+ color: "error",
312
+ startIcon: /* @__PURE__ */ l(E, {}),
313
+ onClick: () => je(e),
314
+ children: "Cancel"
315
+ }) : null]
316
+ });
317
+ })()
318
+ })
319
+ ]
320
+ }, e.id)) })]
321
+ })]
322
+ })]
323
+ })
324
+ }),
325
+ /* @__PURE__ */ u(m, {
326
+ open: R.open,
327
+ onClose: Z,
328
+ maxWidth: "sm",
329
+ fullWidth: !0,
330
+ children: [
331
+ /* @__PURE__ */ u(h, { children: ["Confirm transfer #", R.transfer?.serialId] }),
332
+ /* @__PURE__ */ l(me, { children: R.transfer ? /* @__PURE__ */ u(g, {
333
+ spacing: 2,
334
+ sx: { mt: 1 },
335
+ children: [
336
+ /* @__PURE__ */ u(f, {
337
+ sx: (e) => ({
338
+ p: 1.5,
339
+ borderRadius: 1.5,
340
+ bgcolor: C(e.palette.primary.main, .04),
341
+ border: `1px solid ${C(e.palette.primary.main, .12)}`
342
+ }),
343
+ children: [
344
+ /* @__PURE__ */ u(x, {
345
+ variant: "body2",
346
+ children: [
347
+ /* @__PURE__ */ l("strong", { children: R.transfer.productName }),
348
+ " · qty ",
349
+ R.transfer.qty
350
+ ]
351
+ }),
352
+ /* @__PURE__ */ u(x, {
353
+ variant: "caption",
354
+ color: "text.secondary",
355
+ sx: { display: "block" },
356
+ children: [
357
+ "Shipped ",
358
+ oe(R.transfer.shippedOn),
359
+ " by ",
360
+ R.transfer.shippedByName ?? `#${R.transfer.shippedBy}`,
361
+ " from ",
362
+ R.transfer.sourceFacilityName
363
+ ]
364
+ }),
365
+ R.transfer.lotNumber ? /* @__PURE__ */ u(x, {
366
+ variant: "caption",
367
+ color: "text.secondary",
368
+ sx: {
369
+ display: "block",
370
+ mt: .5
371
+ },
372
+ children: [
373
+ "Lot ",
374
+ R.transfer.lotNumber,
375
+ R.transfer.expiryDate ? ` · expires ${o(R.transfer.expiryDate)}` : ""
376
+ ]
377
+ }) : null
378
+ ]
379
+ }),
380
+ /* @__PURE__ */ l(te, {
381
+ label: "Landing Storage",
382
+ required: !0,
383
+ disabled: $.length === 0,
384
+ error: !B.destStorageUnitId,
385
+ value: B.destStorageUnitId,
386
+ onChange: (e) => V((t) => ({
387
+ ...t,
388
+ destStorageUnitId: e
389
+ })),
390
+ options: $.map((e) => ({
391
+ value: e.id,
392
+ label: e.unitName
393
+ })),
394
+ helperText: $.length === 0 ? "No storage units at this facility — add one on the Storage Units page first." : R.transfer?.destStorageUnitId ? "Sender suggested a unit (pre-filled). You can change it; cold-chain compatibility is checked server-side." : "Required. Cold-chain compatibility is checked server-side against the product."
395
+ }),
396
+ /* @__PURE__ */ l(b, {
397
+ size: "small",
398
+ multiline: !0,
399
+ minRows: 2,
400
+ label: "Notes (optional)",
401
+ value: B.notes,
402
+ onChange: (e) => V((t) => ({
403
+ ...t,
404
+ notes: e.target.value
405
+ }))
406
+ })
407
+ ]
408
+ }) : null }),
409
+ /* @__PURE__ */ u(pe, { children: [/* @__PURE__ */ l(p, {
410
+ onClick: Z,
411
+ disabled: K,
412
+ children: "Close"
413
+ }), /* @__PURE__ */ l(p, {
414
+ variant: "contained",
415
+ startIcon: /* @__PURE__ */ l(T, {}),
416
+ onClick: () => void Me(),
417
+ disabled: K || !B.destStorageUnitId || $.length === 0,
418
+ children: K ? "Confirming…" : "Confirm Receipt"
419
+ })] })
420
+ ]
421
+ }),
422
+ /* @__PURE__ */ u(m, {
423
+ open: H.open,
424
+ onClose: Q,
425
+ maxWidth: "sm",
426
+ fullWidth: !0,
427
+ children: [
428
+ /* @__PURE__ */ u(h, { children: ["Cancel transfer #", H.transfer?.serialId] }),
429
+ /* @__PURE__ */ l(me, { children: H.transfer ? /* @__PURE__ */ u(g, {
430
+ spacing: 2,
431
+ sx: { mt: 1 },
432
+ children: [/* @__PURE__ */ u(d, {
433
+ severity: "warning",
434
+ children: [
435
+ "Cancelling will credit ",
436
+ H.transfer.qty,
437
+ " ",
438
+ H.transfer.qty === 1 ? "unit" : "units",
439
+ " back to ",
440
+ /* @__PURE__ */ l("strong", { children: H.transfer.sourceFacilityName }),
441
+ "."
442
+ ]
443
+ }), /* @__PURE__ */ l(b, {
444
+ size: "small",
445
+ multiline: !0,
446
+ minRows: 2,
447
+ label: "Reason (optional)",
448
+ value: W,
449
+ onChange: (e) => G(e.target.value)
450
+ })]
451
+ }) : null }),
452
+ /* @__PURE__ */ u(pe, { children: [/* @__PURE__ */ l(p, {
453
+ onClick: Q,
454
+ disabled: K,
455
+ children: "Close"
456
+ }), /* @__PURE__ */ l(p, {
457
+ variant: "contained",
458
+ color: "error",
459
+ startIcon: /* @__PURE__ */ l(E, {}),
460
+ onClick: () => void Ne(),
461
+ disabled: K,
462
+ children: K ? "Cancelling…" : "Cancel Transfer"
463
+ })] })
464
+ ]
465
+ })
466
+ ] });
467
+ }
468
+ //#endregion
469
+ export { D as default };
470
+
471
+ //# sourceMappingURL=TransfersPage-BFVF7Xvc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransfersPage-BFVF7Xvc.js","names":[],"sources":["../src/views/TransfersPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n InputAdornment,\n Skeleton,\n Stack,\n Tab,\n Tabs,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport SearchRoundedIcon from '@mui/icons-material/SearchRounded';\nimport SwapHorizRoundedIcon from '@mui/icons-material/SwapHorizRounded';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport DoNotDisturbRoundedIcon from '@mui/icons-material/DoNotDisturbRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport {\n PmEmptyRow,\n PmRef,\n PmSelect,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport {\n cancelTransfer,\n confirmTransfer,\n getStorageUnits,\n listFacilities,\n listTransfers,\n} from '@pm/services/pmApi';\nimport { formatDate, formatDateTime } from '@pm/utils/format';\nimport { TRANSFER_STATUSES, labelOf } from '@pm/utils/constants';\n\nfunction statusChipColor(status) {\n switch (status) {\n case 'PENDING': return 'info';\n case 'COMPLETED': return 'success';\n case 'CANCELLED': return 'default';\n default: return 'default';\n }\n}\n\nexport default function TransfersPage() {\n const navigate = useNavigate();\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.transfer');\n const [rows, setRows] = useState([]);\n const [storageUnits, setStorageUnits] = useState([]);\n // UUIDs of facilities the current user is assigned to — controls which\n // per-row action buttons render. Confirm is reserved for users at the\n // destination facility; cancel is reserved for users at the source.\n const [assignedFacilityIds, setAssignedFacilityIds] = useState(() => new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [tab, setTab] = useState('all');\n const [search, setSearch] = useState('');\n const [confirmDialog, setConfirmDialog] = useState({ open: false, transfer: null });\n const [confirmForm, setConfirmForm] = useState({ destStorageUnitId: '', notes: '' });\n const [cancelDialog, setCancelDialog] = useState({ open: false, transfer: null });\n const [cancelNotes, setCancelNotes] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const [t, su, fac] = await Promise.all([\n listTransfers(),\n getStorageUnits({ activeOnly: true }).catch(() => []),\n listFacilities().catch(() => []),\n ]);\n setRows(t);\n setStorageUnits(su);\n setAssignedFacilityIds(new Set(fac.map((f) => f.id)));\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load transfers';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.transfer', () => { void load(); }, []);\n\n const counts = useMemo(() => ({\n incoming: rows.filter((r) => r.status === 'PENDING').length,\n outgoing: rows.filter((r) => r.status === 'PENDING').length,\n }), [rows]);\n\n const filtered = useMemo(() => {\n let base = rows;\n if (tab === 'incoming') base = base.filter((r) => r.status === 'PENDING');\n if (tab === 'outgoing') base = base.filter((r) => r.status === 'PENDING');\n const q = search.trim().toLowerCase();\n if (q) {\n base = base.filter((r) => {\n const hay = `${r.productName ?? ''} ${r.sourceFacilityName ?? ''} ${r.destFacilityName ?? ''} ${r.lotNumber ?? ''} ${r.notes ?? ''}`.toLowerCase();\n return hay.includes(q);\n });\n }\n return base;\n }, [rows, tab, search]);\n\n function openConfirm(t) {\n setConfirmForm({\n destStorageUnitId: t.destStorageUnitId ?? '',\n notes: '',\n });\n setConfirmDialog({ open: true, transfer: t });\n }\n\n function closeConfirm() {\n if (submitting) return;\n setConfirmDialog({ open: false, transfer: null });\n }\n\n function openCancel(t) {\n setCancelNotes('');\n setCancelDialog({ open: true, transfer: t });\n }\n\n function closeCancel() {\n if (submitting) return;\n setCancelDialog({ open: false, transfer: null });\n }\n\n // Storage units belonging to the receiver's facility — receiver picks one\n // (or accepts the sender's suggestion).\n const destUnits = useMemo(() => {\n if (!confirmDialog.transfer) return [];\n return storageUnits.filter((u) => u.ownerId === confirmDialog.transfer.destFacilityId);\n }, [storageUnits, confirmDialog.transfer]);\n\n async function submitConfirm() {\n if (!confirmDialog.transfer) return;\n setSubmitting(true);\n try {\n await confirmTransfer(confirmDialog.transfer.id, {\n destStorageUnitId: confirmForm.destStorageUnitId || null,\n notes: confirmForm.notes || null,\n });\n showToast({ message: 'Transfer confirmed — stock landed at the destination.', type: 'success' });\n closeConfirm();\n await load();\n } catch (err) {\n showToast({ message: err?.response?.data?.message ?? err?.message ?? 'Failed to confirm transfer', type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n async function submitCancel() {\n if (!cancelDialog.transfer) return;\n setSubmitting(true);\n try {\n await cancelTransfer(cancelDialog.transfer.id, { notes: cancelNotes || null });\n showToast({ message: 'Transfer cancelled — stock returned to the source.', type: 'success' });\n closeCancel();\n await load();\n } catch (err) {\n showToast({ message: err?.response?.data?.message ?? err?.message ?? 'Failed to cancel transfer', type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.transfer'}>\n <PmPageShell\n title=\"Stock Transfers\"\n subtitle=\"Stock movements between facilities. The sender loses stock when shipping. The receiver gains it when they confirm.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canWrite ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/transfers/new')}>\n New Transfer\n </Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Operations\"\n title=\"Transfers\"\n subtitle={loading ? 'Loading…' : `${filtered.length} ${filtered.length === 1 ? 'transfer' : 'transfers'}`}\n >\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} sx={{ mb: 2 }} alignItems={{ md: 'center' }}>\n <Tabs value={tab} onChange={(_, v) => setTab(v)} sx={{ minHeight: 40 }}>\n <Tab value=\"all\" label={`All${rows.length ? ` (${rows.length})` : ''}`} sx={{ minHeight: 40, textTransform: 'none', fontWeight: 700 }} />\n <Tab value=\"incoming\" label={`Pending${counts.incoming ? ` (${counts.incoming})` : ''}`} sx={{ minHeight: 40, textTransform: 'none', fontWeight: 700 }} />\n </Tabs>\n <Box sx={{ flexGrow: 1 }} />\n <TextField\n size=\"small\" fullWidth\n placeholder=\"Search by product, facility, lot, notes…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ maxWidth: { md: 360 } }}\n InputProps={{\n startAdornment: <InputAdornment position=\"start\"><SearchRoundedIcon fontSize=\"small\" /></InputAdornment>,\n }}\n />\n </Stack>\n\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Product</TableCell>\n <TableCell>From</TableCell>\n <TableCell>To</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell>Shipped</TableCell>\n <TableCell>Status</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 4 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 8 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : filtered.length === 0 ? (\n <PmEmptyRow\n colSpan={8}\n icon={SwapHorizRoundedIcon}\n title={search.trim() !== ''\n ? 'No transfers match your search'\n : tab === 'incoming'\n ? 'No pending transfers'\n : 'No transfers yet'}\n hint=\"Create a transfer to move stock between facilities.\"\n action={canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/transfers/new')}>\n Ship first transfer\n </Button>\n ) : null}\n />\n ) : filtered.map((r) => (\n <TableRow key={r.id} hover>\n <TableCell><PmRef id={r.serialId} /></TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>{r.productName ?? '—'}</Typography>\n {r.lotNumber ? (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', color: 'text.secondary' }}>\n {r.lotNumber}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>{r.sourceFacilityName ?? '—'}</TableCell>\n <TableCell>{r.destFacilityName ?? '—'}</TableCell>\n <TableCell align=\"right\">\n <Typography sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{r.qty}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">{formatDate(r.shippedOn)}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">{r.shippedByName ?? `#${r.shippedBy}`}</Typography>\n </TableCell>\n <TableCell>\n <Chip size=\"small\" label={labelOf(TRANSFER_STATUSES, r.status)} color={statusChipColor(r.status)} />\n </TableCell>\n <TableCell align=\"right\">\n {(() => {\n // Two-party rule: only destination-facility users can\n // confirm; only source-facility users can cancel. The\n // backend enforces both checks too — this just hides\n // the buttons a user couldn't act on. A user assigned\n // to both ends sees both buttons.\n if (r.status !== 'PENDING' || !canWrite) {\n return <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>;\n }\n const canConfirm = assignedFacilityIds.has(r.destFacilityId);\n const canCancel = assignedFacilityIds.has(r.sourceFacilityId);\n if (!canConfirm && !canCancel) {\n return <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>;\n }\n return (\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\">\n {canConfirm ? (\n <Button size=\"small\" variant=\"outlined\" startIcon={<CheckCircleRoundedIcon />}\n onClick={() => openConfirm(r)}>\n Confirm\n </Button>\n ) : null}\n {canCancel ? (\n <Button size=\"small\" variant=\"outlined\" color=\"error\" startIcon={<DoNotDisturbRoundedIcon />}\n onClick={() => openCancel(r)}>\n Cancel\n </Button>\n ) : null}\n </Stack>\n );\n })()}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n\n {/* ---------- Confirm dialog ---------- */}\n <Dialog open={confirmDialog.open} onClose={closeConfirm} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Confirm transfer #{confirmDialog.transfer?.serialId}</DialogTitle>\n <DialogContent>\n {confirmDialog.transfer ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Box sx={(t) => ({\n p: 1.5, borderRadius: 1.5,\n bgcolor: alpha(t.palette.primary.main, 0.04),\n border: `1px solid ${alpha(t.palette.primary.main, 0.12)}`,\n })}>\n <Typography variant=\"body2\"><strong>{confirmDialog.transfer.productName}</strong> · qty {confirmDialog.transfer.qty}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Shipped {formatDateTime(confirmDialog.transfer.shippedOn)} by {confirmDialog.transfer.shippedByName ?? `#${confirmDialog.transfer.shippedBy}`} from {confirmDialog.transfer.sourceFacilityName}\n </Typography>\n {confirmDialog.transfer.lotNumber ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5 }}>\n Lot {confirmDialog.transfer.lotNumber}\n {confirmDialog.transfer.expiryDate ? ` · expires ${formatDate(confirmDialog.transfer.expiryDate)}` : ''}\n </Typography>\n ) : null}\n </Box>\n\n <PmSelect\n label=\"Landing Storage\"\n required\n disabled={destUnits.length === 0}\n error={!confirmForm.destStorageUnitId}\n value={confirmForm.destStorageUnitId}\n onChange={(v) => setConfirmForm((f) => ({ ...f, destStorageUnitId: v }))}\n options={destUnits.map((u) => ({ value: u.id, label: u.unitName }))}\n helperText={destUnits.length === 0\n ? 'No storage units at this facility — add one on the Storage Units page first.'\n : confirmDialog.transfer?.destStorageUnitId\n ? 'Sender suggested a unit (pre-filled). You can change it; cold-chain compatibility is checked server-side.'\n : 'Required. Cold-chain compatibility is checked server-side against the product.'}\n />\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={confirmForm.notes}\n onChange={(e) => setConfirmForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeConfirm} disabled={submitting}>Close</Button>\n <Button variant=\"contained\" startIcon={<CheckCircleRoundedIcon />}\n onClick={() => void submitConfirm()}\n disabled={submitting || !confirmForm.destStorageUnitId || destUnits.length === 0}>\n {submitting ? 'Confirming…' : 'Confirm Receipt'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* ---------- Cancel dialog ---------- */}\n <Dialog open={cancelDialog.open} onClose={closeCancel} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Cancel transfer #{cancelDialog.transfer?.serialId}</DialogTitle>\n <DialogContent>\n {cancelDialog.transfer ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Alert severity=\"warning\">\n Cancelling will credit {cancelDialog.transfer.qty} {cancelDialog.transfer.qty === 1 ? 'unit' : 'units'} back to <strong>{cancelDialog.transfer.sourceFacilityName}</strong>.\n </Alert>\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Reason (optional)\"\n value={cancelNotes}\n onChange={(e) => setCancelNotes(e.target.value)}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeCancel} disabled={submitting}>Close</Button>\n <Button variant=\"contained\" color=\"error\" startIcon={<DoNotDisturbRoundedIcon />}\n onClick={() => void submitCancel()} disabled={submitting}>\n {submitting ? 'Cancelling…' : 'Cancel Transfer'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n"],"mappings":"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"}