@argusoft/medplat-product-management 1.0.0

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 (65) hide show
  1. package/dist/BrandsPage-DCMCVvDY.js +334 -0
  2. package/dist/BrandsPage-DCMCVvDY.js.map +1 -0
  3. package/dist/CategoriesPage-BpRhwfrc.js +284 -0
  4. package/dist/CategoriesPage-BpRhwfrc.js.map +1 -0
  5. package/dist/DashboardPage-BNKUQj46.js +436 -0
  6. package/dist/DashboardPage-BNKUQj46.js.map +1 -0
  7. package/dist/FacilityPicker-Coi8I3yE.js +79 -0
  8. package/dist/FacilityPicker-Coi8I3yE.js.map +1 -0
  9. package/dist/InventoryPage-BR6jOzg2.js +517 -0
  10. package/dist/InventoryPage-BR6jOzg2.js.map +1 -0
  11. package/dist/MemberProfileCard-DbHZCS5n.js +272 -0
  12. package/dist/MemberProfileCard-DbHZCS5n.js.map +1 -0
  13. package/dist/PaymentCreatePage-Ci3ERnby.js +487 -0
  14. package/dist/PaymentCreatePage-Ci3ERnby.js.map +1 -0
  15. package/dist/PaymentsPage-sdg902zX.js +157 -0
  16. package/dist/PaymentsPage-sdg902zX.js.map +1 -0
  17. package/dist/PickupCreatePage-CieMsgWV.js +310 -0
  18. package/dist/PickupCreatePage-CieMsgWV.js.map +1 -0
  19. package/dist/PickupsPage-Ci2Ll0Kn.js +566 -0
  20. package/dist/PickupsPage-Ci2Ll0Kn.js.map +1 -0
  21. package/dist/PmGuard-CjJBisaN.js +1195 -0
  22. package/dist/PmGuard-CjJBisaN.js.map +1 -0
  23. package/dist/PmTable-BuXZQZCU.js +302 -0
  24. package/dist/PmTable-BuXZQZCU.js.map +1 -0
  25. package/dist/ProductEditPage-DL8gy85Y.js +666 -0
  26. package/dist/ProductEditPage-DL8gy85Y.js.map +1 -0
  27. package/dist/ProductsPage-BANTKxLb.js +221 -0
  28. package/dist/ProductsPage-BANTKxLb.js.map +1 -0
  29. package/dist/PurchaseCreatePage-C3KMfBxJ.js +626 -0
  30. package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +1 -0
  31. package/dist/PurchaseRequestDetailPage-C0GYFJDl.js +586 -0
  32. package/dist/PurchaseRequestDetailPage-C0GYFJDl.js.map +1 -0
  33. package/dist/PurchaseRequestsPage-DvFH_tWe.js +265 -0
  34. package/dist/PurchaseRequestsPage-DvFH_tWe.js.map +1 -0
  35. package/dist/PurchasesPage-BCvLvSp4.js +295 -0
  36. package/dist/PurchasesPage-BCvLvSp4.js.map +1 -0
  37. package/dist/SaleCreatePage-DpkQMoTq.js +548 -0
  38. package/dist/SaleCreatePage-DpkQMoTq.js.map +1 -0
  39. package/dist/SalesPage-DUwgkEO-.js +315 -0
  40. package/dist/SalesPage-DUwgkEO-.js.map +1 -0
  41. package/dist/SettingsPage-CusC0jqJ.js +710 -0
  42. package/dist/SettingsPage-CusC0jqJ.js.map +1 -0
  43. package/dist/StorageUnitsPage-BlC2AgrJ.js +469 -0
  44. package/dist/StorageUnitsPage-BlC2AgrJ.js.map +1 -0
  45. package/dist/TransactionsPage-DDaK4VyY.js +714 -0
  46. package/dist/TransactionsPage-DDaK4VyY.js.map +1 -0
  47. package/dist/TransferCreatePage-BxudLfhS.js +363 -0
  48. package/dist/TransferCreatePage-BxudLfhS.js.map +1 -0
  49. package/dist/TransfersPage-zgmt7teZ.js +480 -0
  50. package/dist/TransfersPage-zgmt7teZ.js.map +1 -0
  51. package/dist/VialsPage-CjqPfgpV.js +855 -0
  52. package/dist/VialsPage-CjqPfgpV.js.map +1 -0
  53. package/dist/constants-BrA_hfAI.js +254 -0
  54. package/dist/constants-BrA_hfAI.js.map +1 -0
  55. package/dist/currency-BDDCDgeE.js +169 -0
  56. package/dist/currency-BDDCDgeE.js.map +1 -0
  57. package/dist/format-UOyOu75i.js +52 -0
  58. package/dist/format-UOyOu75i.js.map +1 -0
  59. package/dist/index.js +45 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/useFieldErrors-hDG8ox_x.js +29 -0
  62. package/dist/useFieldErrors-hDG8ox_x.js.map +1 -0
  63. package/dist/validation-Ba7puFIO.js +109 -0
  64. package/dist/validation-Ba7puFIO.js.map +1 -0
  65. package/package.json +36 -0
@@ -0,0 +1,157 @@
1
+ import { B as e, O as t, a as n, n as r, r as i, t as a } from "./PmGuard-CjJBisaN.js";
2
+ import { a as o, i as s, o as c, r as l, t as u } from "./PmTable-BuXZQZCU.js";
3
+ import { t as d } from "./format-UOyOu75i.js";
4
+ import { useState as f } from "react";
5
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
6
+ import { Alert as h, Box as g, Button as _, Chip as v, Skeleton as y, Stack as b, TableBody as x, TableCell as S, TableHead as C, TableRow as w, Typography as T } from "@mui/material";
7
+ import "@mui/icons-material/AddRounded";
8
+ import E from "@mui/icons-material/RefreshRounded";
9
+ import { showToast as D } from "@/common/toaster/toaster";
10
+ import { useNavigate as O } from "react-router-dom";
11
+ import k from "@mui/icons-material/PaymentsRounded";
12
+ //#region src/views/PaymentsPage.jsx
13
+ function A() {
14
+ O();
15
+ let [A, j] = f([]), [M, N] = f({}), [P, F] = f(!1), [I, L] = f("");
16
+ async function R() {
17
+ F(!0), L("");
18
+ try {
19
+ let n = await e(0, 50);
20
+ j(n);
21
+ let r = Array.from(new Set(n.map((e) => e.memberId).filter(Boolean)));
22
+ if (r.length === 0) N({});
23
+ else try {
24
+ let e = await t(r), n = {};
25
+ e.forEach((e) => {
26
+ n[e.id] = e.name;
27
+ }), N(n);
28
+ } catch {
29
+ N({});
30
+ }
31
+ } catch (e) {
32
+ let t = e?.response?.data?.message ?? e?.message ?? "Failed to load";
33
+ L(t), D({
34
+ message: t,
35
+ type: "error"
36
+ });
37
+ } finally {
38
+ F(!1);
39
+ }
40
+ }
41
+ return i("view.manage.productManagement.payment", () => {
42
+ R();
43
+ }, []), /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(r, {}), /* @__PURE__ */ p(a, {
44
+ perm: "view.manage.productManagement.payment",
45
+ children: /* @__PURE__ */ m(n, {
46
+ title: "Debt Payments",
47
+ subtitle: "Payments collected from customers. Matched to their sales in order.",
48
+ actions: /* @__PURE__ */ m(b, {
49
+ direction: "row",
50
+ spacing: 1,
51
+ children: [/* @__PURE__ */ p(_, {
52
+ variant: "outlined",
53
+ startIcon: /* @__PURE__ */ p(E, {}),
54
+ onClick: () => void R(),
55
+ children: "Refresh"
56
+ }), !1]
57
+ }),
58
+ children: [I ? /* @__PURE__ */ p(h, {
59
+ severity: "error",
60
+ sx: { mb: 2 },
61
+ children: I
62
+ }) : null, /* @__PURE__ */ p(c, {
63
+ eyebrow: "History",
64
+ title: "Recent Payments",
65
+ subtitle: P ? "Loading…" : `${A.length} ${A.length === 1 ? "payment" : "payments"} recorded`,
66
+ children: /* @__PURE__ */ m(o, {
67
+ dense: !0,
68
+ children: [/* @__PURE__ */ p(C, { children: /* @__PURE__ */ m(w, { children: [
69
+ /* @__PURE__ */ p(S, { children: "Ref" }),
70
+ /* @__PURE__ */ p(S, { children: "Date" }),
71
+ /* @__PURE__ */ p(S, { children: "Member" }),
72
+ /* @__PURE__ */ p(S, { children: "Mode" }),
73
+ /* @__PURE__ */ p(S, {
74
+ align: "right",
75
+ children: "Amount"
76
+ }),
77
+ /* @__PURE__ */ p(S, {
78
+ align: "right",
79
+ children: "Allocations"
80
+ })
81
+ ] }) }), /* @__PURE__ */ p(x, { children: P ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ p(w, { children: Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ p(S, { children: /* @__PURE__ */ p(y, { height: 22 }) }, t)) }, t)) : A.length === 0 ? /* @__PURE__ */ p(u, {
82
+ colSpan: 6,
83
+ icon: k,
84
+ title: "No payments yet",
85
+ hint: "Payments appear here with how many sales they're applied to."
86
+ }) : A.map((e) => {
87
+ let t = M[e.memberId];
88
+ return /* @__PURE__ */ m(w, {
89
+ hover: !0,
90
+ children: [
91
+ /* @__PURE__ */ p(S, { children: /* @__PURE__ */ p(s, { id: e.serialId }) }),
92
+ /* @__PURE__ */ p(S, { children: /* @__PURE__ */ p(T, {
93
+ variant: "body2",
94
+ sx: { fontWeight: 700 },
95
+ children: d(e.paymentDate)
96
+ }) }),
97
+ /* @__PURE__ */ p(S, { children: t ? /* @__PURE__ */ p(T, {
98
+ variant: "body2",
99
+ sx: { fontWeight: 700 },
100
+ children: t
101
+ }) : /* @__PURE__ */ m(T, {
102
+ variant: "caption",
103
+ sx: {
104
+ fontFamily: "monospace",
105
+ color: "text.secondary"
106
+ },
107
+ children: [e.memberId?.slice(0, 8), "…"]
108
+ }) }),
109
+ /* @__PURE__ */ p(S, { children: e.paymentMode ? /* @__PURE__ */ p(v, {
110
+ size: "small",
111
+ label: e.paymentMode,
112
+ sx: {
113
+ fontWeight: 700,
114
+ borderRadius: 1.5,
115
+ height: 22
116
+ }
117
+ }) : /* @__PURE__ */ p(T, {
118
+ variant: "caption",
119
+ color: "text.disabled",
120
+ children: "—"
121
+ }) }),
122
+ /* @__PURE__ */ p(S, {
123
+ align: "right",
124
+ children: /* @__PURE__ */ p(l, {
125
+ value: e.amount,
126
+ tone: "success"
127
+ })
128
+ }),
129
+ /* @__PURE__ */ p(S, {
130
+ align: "right",
131
+ children: /* @__PURE__ */ p(g, {
132
+ component: "span",
133
+ sx: {
134
+ display: "inline-flex",
135
+ px: 1,
136
+ py: .2,
137
+ borderRadius: 1.5,
138
+ bgcolor: "grey.100",
139
+ fontWeight: 800,
140
+ fontVariantNumeric: "tabular-nums",
141
+ color: "text.secondary"
142
+ },
143
+ children: (e.allocations ?? []).length
144
+ })
145
+ })
146
+ ]
147
+ }, e.id);
148
+ }) })]
149
+ })
150
+ })]
151
+ })
152
+ })] });
153
+ }
154
+ //#endregion
155
+ export { A as default };
156
+
157
+ //# sourceMappingURL=PaymentsPage-sdg902zX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaymentsPage-sdg902zX.js","names":[],"sources":["../src/views/PaymentsPage.jsx"],"sourcesContent":["import { useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from \"@mui/material\";\nimport PaymentsRoundedIcon from \"@mui/icons-material/PaymentsRounded\";\nimport AddRoundedIcon from \"@mui/icons-material/AddRounded\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\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 } from \"@pm/utils/permissions\";\nimport {\n PmEmptyRow,\n PmMoney,\n PmRef,\n PmTable,\n PmTableCard,\n} from \"@pm/components/PmTable\";\nimport { getMembersByIds, listPayments } from \"@pm/services/pmApi\";\nimport { formatDate } from \"@pm/utils/format\";\n\nexport default function PaymentsPage() {\n const navigate = useNavigate();\n const [payments, setPayments] = useState([]);\n // Map of memberId -> display name, hydrated for memberIds present on the\n // loaded payments. Keeps the recent-payments table from showing raw UUIDs\n // without forcing a full member list load.\n const [memberNames, setMemberNames] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n\n async function load() {\n setLoading(true);\n setError(\"\");\n try {\n const list = await listPayments(0, 50);\n setPayments(list);\n const ids = Array.from(\n new Set(list.map((p) => p.memberId).filter(Boolean)),\n );\n if (ids.length === 0) {\n setMemberNames({});\n } else {\n try {\n const refs = await getMembersByIds(ids);\n const map = {};\n refs.forEach((r) => {\n map[r.id] = r.name;\n });\n setMemberNames(map);\n } catch {\n setMemberNames({});\n }\n }\n } catch (err) {\n const message =\n err?.response?.data?.message ?? err?.message ?? \"Failed to load\";\n setError(message);\n showToast({ message, type: \"error\" });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect(\n \"view.manage.productManagement.payment\",\n () => {\n void load();\n },\n [],\n );\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={\"view.manage.productManagement.payment\"}>\n <PmPageShell\n title=\"Debt Payments\"\n subtitle=\"Payments collected from customers. Matched to their sales in order.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<RefreshRoundedIcon />}\n onClick={() => void load()}\n >\n Refresh\n </Button>\n {/* DEMO-ONLY: in production a payment is started by passing the\n member id via the URL (/payments/new/:memberId) from an outside\n flow. Unhide this button to launch the create page directly. */}\n {false && (\n <Button\n variant=\"contained\"\n startIcon={<AddRoundedIcon />}\n onClick={() => navigate(\"/ui/medplat/manage/pm/payments/new\")}\n >\n New Payment\n </Button>\n )}\n </Stack>\n }\n >\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n\n <PmTableCard\n eyebrow=\"History\"\n title=\"Recent Payments\"\n subtitle={\n loading\n ? \"Loading…\"\n : `${payments.length} ${payments.length === 1 ? \"payment\" : \"payments\"} recorded`\n }\n >\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Date</TableCell>\n <TableCell>Member</TableCell>\n <TableCell>Mode</TableCell>\n <TableCell align=\"right\">Amount</TableCell>\n <TableCell align=\"right\">Allocations</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 4 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 6 }).map((__, j) => (\n <TableCell key={j}>\n <Skeleton height={22} />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : payments.length === 0 ? (\n <PmEmptyRow\n colSpan={6}\n icon={PaymentsRoundedIcon}\n title=\"No payments yet\"\n hint=\"Payments appear here with how many sales they're applied to.\"\n />\n ) : (\n payments.map((p) => {\n const memberName = memberNames[p.memberId];\n return (\n <TableRow key={p.id} hover>\n <TableCell>\n <PmRef id={p.serialId} />\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {formatDate(p.paymentDate)}\n </Typography>\n </TableCell>\n <TableCell>\n {memberName ? (\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700 }}\n >\n {memberName}\n </Typography>\n ) : (\n <Typography\n variant=\"caption\"\n sx={{\n fontFamily: \"monospace\",\n color: \"text.secondary\",\n }}\n >\n {p.memberId?.slice(0, 8)}…\n </Typography>\n )}\n </TableCell>\n <TableCell>\n {p.paymentMode ? (\n <Chip\n size=\"small\"\n label={p.paymentMode}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney value={p.amount} tone=\"success\" />\n </TableCell>\n <TableCell align=\"right\">\n <Box\n component=\"span\"\n sx={{\n display: \"inline-flex\",\n px: 1,\n py: 0.2,\n borderRadius: 1.5,\n bgcolor: \"grey.100\",\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n color: \"text.secondary\",\n }}\n >\n {(p.allocations ?? []).length}\n </Box>\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ import { $ as e, I as t, L as n, P as ee, a as r, n as i, r as te, t as a } from "./PmGuard-CjJBisaN.js";
2
+ import { n as o } from "./PmTable-BuXZQZCU.js";
3
+ import { t as s } from "./format-UOyOu75i.js";
4
+ import { useMemo as c, useState as l } from "react";
5
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
6
+ import { v4 as f } from "uuid";
7
+ import { Alert as p, Autocomplete as m, Box as h, Button as g, Card as _, CardContent as v, Chip as y, FormControl as b, FormHelperText as x, Grid as S, InputLabel as C, MenuItem as w, Select as T, Stack as E, TextField as D, Typography as O } from "@mui/material";
8
+ import { showToast as k } from "@/common/toaster/toaster";
9
+ import { useNavigate as A } from "react-router-dom";
10
+ import j from "@mui/icons-material/SaveRounded";
11
+ //#region src/views/PickupCreatePage.jsx
12
+ function M(e) {
13
+ return !(e.ownerType !== "FACILITY" || Number(e.qtyRemaining ?? 0) <= 0 || e.status === "EXPIRED" || e.status === "EXHAUSTED" || e.status === "QUARANTINED");
14
+ }
15
+ function N() {
16
+ let N = A(), [P, F] = l([]), [I, ne] = l([]), [L, re] = l([]), [R, z] = l(!0), [B, V] = l(!1), [H, U] = l(""), [W, G] = l({
17
+ id: f(),
18
+ personalBatchId: f(),
19
+ facilityId: "",
20
+ sourceBatchId: "",
21
+ pickedQty: 1,
22
+ notes: ""
23
+ });
24
+ te("update.manage.productManagement.pickup", () => {
25
+ async function e() {
26
+ try {
27
+ let [e, r, i] = await Promise.all([
28
+ t(),
29
+ ee(),
30
+ n().catch(() => [])
31
+ ]);
32
+ F(e), ne(r), re(i);
33
+ } catch (e) {
34
+ U(e?.response?.data?.message ?? e?.message ?? "Failed to load reference data");
35
+ } finally {
36
+ z(!1);
37
+ }
38
+ }
39
+ e();
40
+ }, []);
41
+ let K = L.length > 0, q = c(() => W.facilityId ? I.filter(M).filter((e) => e.ownerId === W.facilityId) : [], [I, W.facilityId]), J = c(() => I.find((e) => e.id === W.sourceBatchId) ?? null, [I, W.sourceBatchId]);
42
+ function Y(e, t) {
43
+ G((n) => ({
44
+ ...n,
45
+ [e]: t
46
+ }));
47
+ }
48
+ function ie(e) {
49
+ G((t) => ({
50
+ ...t,
51
+ facilityId: e,
52
+ sourceBatchId: ""
53
+ }));
54
+ }
55
+ let X = Number(W.pickedQty), Z = Number(J?.qtyRemaining ?? 0), Q = J ? !Number.isInteger(X) || X <= 0 ? "Enter a whole number greater than 0." : X > Z ? `Only ${Z} available in this batch.` : "" : "", $ = !!W.facilityId && !!W.sourceBatchId && !Q && !K;
56
+ async function ae() {
57
+ if ($) {
58
+ V(!0), U("");
59
+ try {
60
+ let t = await e({
61
+ id: W.id,
62
+ personalBatchId: W.personalBatchId,
63
+ sourceBatchId: W.sourceBatchId,
64
+ pickedQty: X,
65
+ notes: W.notes || null
66
+ });
67
+ k({
68
+ message: `Picked up ${t.pickedQty} unit${t.pickedQty === 1 ? "" : "s"}.`,
69
+ type: "success"
70
+ }), N("/ui/medplat/manage/pm/pickups");
71
+ } catch (e) {
72
+ U(e?.response?.data?.message ?? e?.message ?? "Failed to record pickup");
73
+ } finally {
74
+ V(!1);
75
+ }
76
+ }
77
+ }
78
+ return /* @__PURE__ */ d(h, { children: [/* @__PURE__ */ u(i, {}), /* @__PURE__ */ u(a, {
79
+ perm: "update.manage.productManagement.pickup",
80
+ title: "You don’t have permission to record pickups",
81
+ children: /* @__PURE__ */ d(r, {
82
+ title: "Record Pickup",
83
+ subtitle: "Check out stock from a facility for your field work. Record returns and wastage when you bring stock back.",
84
+ actions: /* @__PURE__ */ d(E, {
85
+ direction: "row",
86
+ spacing: 1,
87
+ children: [/* @__PURE__ */ u(g, {
88
+ variant: "outlined",
89
+ onClick: () => N("/ui/medplat/manage/pm/pickups"),
90
+ children: "Cancel"
91
+ }), /* @__PURE__ */ u(g, {
92
+ variant: "contained",
93
+ startIcon: /* @__PURE__ */ u(j, {}),
94
+ disabled: !$ || B,
95
+ onClick: () => void ae(),
96
+ children: B ? "Recording…" : "Record Pickup"
97
+ })]
98
+ }),
99
+ children: [
100
+ H ? /* @__PURE__ */ u(p, {
101
+ severity: "error",
102
+ sx: { mb: 2 },
103
+ children: H
104
+ }) : null,
105
+ K ? /* @__PURE__ */ d(p, {
106
+ severity: "warning",
107
+ sx: { mb: 2 },
108
+ action: /* @__PURE__ */ u(g, {
109
+ color: "inherit",
110
+ size: "small",
111
+ onClick: () => N("/ui/medplat/manage/pm/pickups"),
112
+ children: "Go to Pickups"
113
+ }),
114
+ children: [
115
+ "You already have ",
116
+ /* @__PURE__ */ u("strong", { children: L.length }),
117
+ " open outreach session",
118
+ L.length === 1 ? "" : "s",
119
+ ". End the active session",
120
+ L.length === 1 ? "" : "s",
121
+ " before starting a new pickup, or use ",
122
+ /* @__PURE__ */ u("strong", { children: "Top Up" }),
123
+ " on the Pickups page to add more stock to an active session."
124
+ ]
125
+ }) : null,
126
+ /* @__PURE__ */ u(_, {
127
+ sx: {
128
+ borderRadius: 4,
129
+ mb: 2,
130
+ border: "1px solid",
131
+ borderColor: "divider",
132
+ boxShadow: "0 12px 32px rgba(15, 23, 42, 0.045)"
133
+ },
134
+ children: /* @__PURE__ */ d(v, {
135
+ sx: { p: 2.5 },
136
+ children: [/* @__PURE__ */ u(o, {
137
+ eyebrow: "Step 1",
138
+ title: "Source",
139
+ hint: "Select a facility and then the batch to pick up.",
140
+ sx: { mb: 2 }
141
+ }), /* @__PURE__ */ d(S, {
142
+ container: !0,
143
+ spacing: 2,
144
+ children: [/* @__PURE__ */ u(S, {
145
+ item: !0,
146
+ xs: 12,
147
+ md: 5,
148
+ children: /* @__PURE__ */ u(m, {
149
+ size: "small",
150
+ options: P,
151
+ getOptionLabel: (e) => e?.name ?? "",
152
+ isOptionEqualToValue: (e, t) => e?.id === t?.id,
153
+ value: P.find((e) => e.id === W.facilityId) ?? null,
154
+ onChange: (e, t) => ie(t?.id ?? ""),
155
+ loading: R,
156
+ renderInput: (e) => /* @__PURE__ */ u(D, {
157
+ ...e,
158
+ required: !0,
159
+ label: "Source Facility",
160
+ placeholder: "Pick a facility you're assigned to"
161
+ })
162
+ })
163
+ }), /* @__PURE__ */ u(S, {
164
+ item: !0,
165
+ xs: 12,
166
+ md: 7,
167
+ children: /* @__PURE__ */ d(b, {
168
+ required: !0,
169
+ fullWidth: !0,
170
+ size: "small",
171
+ disabled: !W.facilityId,
172
+ children: [
173
+ /* @__PURE__ */ u(C, { children: "Source Batch" }),
174
+ /* @__PURE__ */ u(T, {
175
+ label: "Source Batch",
176
+ value: W.sourceBatchId,
177
+ onChange: (e) => Y("sourceBatchId", e.target.value),
178
+ children: q.length === 0 ? /* @__PURE__ */ u(w, {
179
+ disabled: !0,
180
+ value: "",
181
+ children: /* @__PURE__ */ u("em", { children: "No pickable stock in this facility" })
182
+ }) : q.map((e) => /* @__PURE__ */ d(w, {
183
+ value: e.id,
184
+ children: [
185
+ /* @__PURE__ */ u(h, {
186
+ component: "span",
187
+ sx: {
188
+ fontWeight: 700,
189
+ mr: 1
190
+ },
191
+ children: e.productName
192
+ }),
193
+ /* @__PURE__ */ d(O, {
194
+ variant: "caption",
195
+ color: "text.secondary",
196
+ sx: { mr: 1 },
197
+ children: ["qty ", e.qtyRemaining]
198
+ }),
199
+ e.lotNumber ? /* @__PURE__ */ u(O, {
200
+ variant: "caption",
201
+ sx: {
202
+ fontFamily: "monospace",
203
+ mr: 1
204
+ },
205
+ children: e.lotNumber
206
+ }) : null,
207
+ e.expiryDate ? /* @__PURE__ */ d(O, {
208
+ variant: "caption",
209
+ color: "text.secondary",
210
+ children: ["exp ", s(e.expiryDate)]
211
+ }) : null
212
+ ]
213
+ }, e.id))
214
+ }),
215
+ /* @__PURE__ */ u(x, { children: W.facilityId ? q.length === 0 ? "This facility has no in-stock batches you can pick up right now." : "Active facility batches only — quarantined / expired / exhausted stock is hidden." : "Pick a facility first." })
216
+ ]
217
+ })
218
+ })]
219
+ })]
220
+ })
221
+ }),
222
+ J ? /* @__PURE__ */ u(_, {
223
+ sx: {
224
+ borderRadius: 4,
225
+ mb: 2,
226
+ border: "1px solid",
227
+ borderColor: "divider",
228
+ boxShadow: "0 12px 32px rgba(15, 23, 42, 0.045)"
229
+ },
230
+ children: /* @__PURE__ */ d(v, {
231
+ sx: { p: 2.5 },
232
+ children: [
233
+ /* @__PURE__ */ u(o, {
234
+ eyebrow: "Step 2",
235
+ title: "Quantity",
236
+ hint: `Available: ${Z}. You can pick up to this amount.`,
237
+ sx: { mb: 2 }
238
+ }),
239
+ /* @__PURE__ */ d(S, {
240
+ container: !0,
241
+ spacing: 2,
242
+ children: [/* @__PURE__ */ u(S, {
243
+ item: !0,
244
+ xs: 12,
245
+ md: 4,
246
+ children: /* @__PURE__ */ u(D, {
247
+ required: !0,
248
+ fullWidth: !0,
249
+ size: "small",
250
+ type: "number",
251
+ label: "Pick Quantity",
252
+ inputProps: {
253
+ min: 1,
254
+ max: Z
255
+ },
256
+ value: W.pickedQty,
257
+ onChange: (e) => Y("pickedQty", e.target.value),
258
+ error: !!Q,
259
+ helperText: Q || `Out of ${Z} available`
260
+ })
261
+ }), /* @__PURE__ */ u(S, {
262
+ item: !0,
263
+ xs: 12,
264
+ md: 8,
265
+ children: /* @__PURE__ */ u(D, {
266
+ fullWidth: !0,
267
+ size: "small",
268
+ label: "Notes (optional)",
269
+ placeholder: "Anything worth recording about this pickup",
270
+ value: W.notes,
271
+ onChange: (e) => Y("notes", e.target.value)
272
+ })
273
+ })]
274
+ }),
275
+ /* @__PURE__ */ d(E, {
276
+ direction: "row",
277
+ spacing: 1,
278
+ sx: { mt: 2 },
279
+ flexWrap: "wrap",
280
+ useFlexGap: !0,
281
+ children: [
282
+ /* @__PURE__ */ u(y, {
283
+ size: "small",
284
+ label: `Product · ${J.productName}`
285
+ }),
286
+ J.lotNumber ? /* @__PURE__ */ u(y, {
287
+ size: "small",
288
+ label: `Lot · ${J.lotNumber}`
289
+ }) : null,
290
+ J.expiryDate ? /* @__PURE__ */ u(y, {
291
+ size: "small",
292
+ label: `Expiry · ${s(J.expiryDate)}`
293
+ }) : null,
294
+ J.storageUnitName ? /* @__PURE__ */ u(y, {
295
+ size: "small",
296
+ label: `From · ${J.storageUnitName}`
297
+ }) : null
298
+ ]
299
+ })
300
+ ]
301
+ })
302
+ }) : null
303
+ ]
304
+ })
305
+ })] });
306
+ }
307
+ //#endregion
308
+ export { N as default };
309
+
310
+ //# sourceMappingURL=PickupCreatePage-CieMsgWV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PickupCreatePage-CieMsgWV.js","names":[],"sources":["../src/views/PickupCreatePage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n FormControl,\n FormHelperText,\n Grid,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n TextField,\n Typography,\n} from '@mui/material';\nimport SaveRoundedIcon from '@mui/icons-material/SaveRounded';\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 } from '@pm/utils/permissions';\nimport { PmFormSection } from '@pm/components/PmTable';\nimport {\n listBatches,\n listFacilities,\n listMyOpenPickups,\n recordPickup,\n} from '@pm/services/pmApi';\nimport { formatDate } from '@pm/utils/format';\n\n// Only facility-owned, in-stock, non-quarantined, non-terminal batches are\n// candidates for pickup. The backend enforces the same rules; filtering here\n// keeps the dropdown free of unactionable rows.\nfunction isPickable(batch) {\n if (batch.ownerType !== 'FACILITY') return false;\n if (Number(batch.qtyRemaining ?? 0) <= 0) return false;\n if (batch.status === 'EXPIRED' || batch.status === 'EXHAUSTED' || batch.status === 'QUARANTINED') return false;\n return true;\n}\n\nexport default function PickupCreatePage() {\n const navigate = useNavigate();\n const [facilities, setFacilities] = useState([]);\n const [batches, setBatches] = useState([]);\n // OPEN pickups already on this user — one-session-per-user rule means\n // any open session blocks a new pickup. The user has to end the session\n // or top it up instead.\n const [openSessions, setOpenSessions] = useState([]);\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState('');\n const [form, setForm] = useState({\n id: uuidv4(),\n personalBatchId: uuidv4(),\n facilityId: '',\n sourceBatchId: '',\n pickedQty: 1,\n notes: '',\n });\n\n usePermissionedEffect('update.manage.productManagement.pickup', () => {\n async function load() {\n try {\n const [f, b, open] = await Promise.all([\n listFacilities(),\n listBatches(),\n listMyOpenPickups().catch(() => []),\n ]);\n setFacilities(f);\n setBatches(b);\n setOpenSessions(open);\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to load reference data');\n } finally {\n setLoading(false);\n }\n }\n void load();\n }, []);\n\n const hasOpenSession = openSessions.length > 0;\n\n // Batches limited to the picked facility (when one is selected). Reset\n // when the facility changes so the user can't carry over a stale batch.\n const eligibleBatches = useMemo(() => {\n if (!form.facilityId) return [];\n return batches.filter(isPickable).filter((b) => b.ownerId === form.facilityId);\n }, [batches, form.facilityId]);\n\n const selectedBatch = useMemo(\n () => batches.find((b) => b.id === form.sourceBatchId) ?? null,\n [batches, form.sourceBatchId],\n );\n\n function patch(k, v) {\n setForm((f) => ({ ...f, [k]: v }));\n }\n\n function patchFacility(id) {\n setForm((f) => ({ ...f, facilityId: id, sourceBatchId: '' }));\n }\n\n const qty = Number(form.pickedQty);\n const remaining = Number(selectedBatch?.qtyRemaining ?? 0);\n const qtyError = !selectedBatch\n ? ''\n : !Number.isInteger(qty) || qty <= 0\n ? 'Enter a whole number greater than 0.'\n : qty > remaining\n ? `Only ${remaining} available in this batch.`\n : '';\n const formIsValid = !!form.facilityId && !!form.sourceBatchId && !qtyError && !hasOpenSession;\n\n async function save() {\n if (!formIsValid) return;\n setSubmitting(true);\n setError('');\n try {\n const created = await recordPickup({\n id: form.id,\n personalBatchId: form.personalBatchId,\n sourceBatchId: form.sourceBatchId,\n pickedQty: qty,\n notes: form.notes || null,\n });\n showToast({ message: `Picked up ${created.pickedQty} unit${created.pickedQty === 1 ? '' : 's'}.`, type: 'success' });\n navigate('/ui/medplat/manage/pm/pickups');\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to record pickup');\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'update.manage.productManagement.pickup'} title=\"You don’t have permission to record pickups\">\n <PmPageShell\n title=\"Record Pickup\"\n subtitle=\"Check out stock from a facility for your field work. Record returns and wastage when you bring stock back.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" onClick={() => navigate('/ui/medplat/manage/pm/pickups')}>Cancel</Button>\n <Button variant=\"contained\" startIcon={<SaveRoundedIcon />}\n disabled={!formIsValid || submitting}\n onClick={() => void save()}>\n {submitting ? 'Recording…' : 'Record Pickup'}\n </Button>\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n {hasOpenSession ? (\n <Alert\n severity=\"warning\"\n sx={{ mb: 2 }}\n action={\n <Button color=\"inherit\" size=\"small\"\n onClick={() => navigate('/ui/medplat/manage/pm/pickups')}>\n Go to Pickups\n </Button>\n }\n >\n You already have <strong>{openSessions.length}</strong> open outreach session{openSessions.length === 1 ? '' : 's'}.\n End the active session{openSessions.length === 1 ? '' : 's'} before starting a new pickup,\n or use <strong>Top Up</strong> on the Pickups page to add more stock to an active session.\n </Alert>\n ) : null}\n\n <Card sx={{ borderRadius: 4, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <PmFormSection\n eyebrow=\"Step 1\"\n title=\"Source\"\n hint=\"Select a facility and then the batch to pick up.\"\n sx={{ mb: 2 }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} md={5}>\n <Autocomplete\n size=\"small\"\n options={facilities}\n getOptionLabel={(f) => f?.name ?? ''}\n isOptionEqualToValue={(a, b) => a?.id === b?.id}\n value={facilities.find((f) => f.id === form.facilityId) ?? null}\n onChange={(_, next) => patchFacility(next?.id ?? '')}\n loading={loading}\n renderInput={(params) => (\n <TextField {...params} required label=\"Source Facility\" placeholder=\"Pick a facility you're assigned to\" />\n )}\n />\n </Grid>\n <Grid item xs={12} md={7}>\n <FormControl required fullWidth size=\"small\" disabled={!form.facilityId}>\n <InputLabel>Source Batch</InputLabel>\n <Select\n label=\"Source Batch\"\n value={form.sourceBatchId}\n onChange={(e) => patch('sourceBatchId', e.target.value)}\n >\n {eligibleBatches.length === 0 ? (\n <MenuItem disabled value=\"\">\n <em>No pickable stock in this facility</em>\n </MenuItem>\n ) : (\n eligibleBatches.map((b) => (\n <MenuItem key={b.id} value={b.id}>\n <Box component=\"span\" sx={{ fontWeight: 700, mr: 1 }}>{b.productName}</Box>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ mr: 1 }}>\n qty {b.qtyRemaining}\n </Typography>\n {b.lotNumber ? (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', mr: 1 }}>\n {b.lotNumber}\n </Typography>\n ) : null}\n {b.expiryDate ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n exp {formatDate(b.expiryDate)}\n </Typography>\n ) : null}\n </MenuItem>\n ))\n )}\n </Select>\n <FormHelperText>\n {!form.facilityId\n ? 'Pick a facility first.'\n : eligibleBatches.length === 0\n ? 'This facility has no in-stock batches you can pick up right now.'\n : 'Active facility batches only — quarantined / expired / exhausted stock is hidden.'}\n </FormHelperText>\n </FormControl>\n </Grid>\n </Grid>\n </CardContent>\n </Card>\n\n {selectedBatch ? (\n <Card sx={{ borderRadius: 4, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <PmFormSection\n eyebrow=\"Step 2\"\n title=\"Quantity\"\n hint={`Available: ${remaining}. You can pick up to this amount.`}\n sx={{ mb: 2 }}\n />\n <Grid container spacing={2}>\n <Grid item xs={12} md={4}>\n <TextField\n required fullWidth size=\"small\" type=\"number\"\n label=\"Pick Quantity\"\n inputProps={{ min: 1, max: remaining }}\n value={form.pickedQty}\n onChange={(e) => patch('pickedQty', e.target.value)}\n error={!!qtyError}\n helperText={qtyError || `Out of ${remaining} available`}\n />\n </Grid>\n <Grid item xs={12} md={8}>\n <TextField\n fullWidth size=\"small\"\n label=\"Notes (optional)\"\n placeholder=\"Anything worth recording about this pickup\"\n value={form.notes}\n onChange={(e) => patch('notes', e.target.value)}\n />\n </Grid>\n </Grid>\n <Stack direction=\"row\" spacing={1} sx={{ mt: 2 }} flexWrap=\"wrap\" useFlexGap>\n <Chip size=\"small\" label={`Product · ${selectedBatch.productName}`} />\n {selectedBatch.lotNumber ? <Chip size=\"small\" label={`Lot · ${selectedBatch.lotNumber}`} /> : null}\n {selectedBatch.expiryDate ? <Chip size=\"small\" label={`Expiry · ${formatDate(selectedBatch.expiryDate)}`} /> : null}\n {selectedBatch.storageUnitName ? <Chip size=\"small\" label={`From · ${selectedBatch.storageUnitName}`} /> : null}\n </Stack>\n </CardContent>\n </Card>\n ) : null}\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}