@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,487 @@
1
+ import { E as e, T as t, _ as n, a as r, c as i, i as a, n as o, r as ee, t as te } from "./PmGuard-CjJBisaN.js";
2
+ import { t as ne } from "./currency-BDDCDgeE.js";
3
+ import { l as re, t as s, u as ie } from "./validation-Ba7puFIO.js";
4
+ import { t as ae } from "./useFieldErrors-hDG8ox_x.js";
5
+ import { r as c, t as l } from "./format-UOyOu75i.js";
6
+ import { n as oe } from "./constants-BrA_hfAI.js";
7
+ import { t as u } from "./MemberProfileCard-DbHZCS5n.js";
8
+ import { useMemo as d, useState as f } from "react";
9
+ import { Fragment as se, jsx as p, jsxs as m } from "react/jsx-runtime";
10
+ import { v4 as ce } from "uuid";
11
+ import { Alert as h, Box as g, Button as _, Card as v, CardContent as y, Chip as le, Divider as b, FormControl as x, InputAdornment as ue, InputLabel as de, LinearProgress as fe, MenuItem as pe, Select as me, Stack as S, Table as C, TableBody as he, TableCell as w, TableContainer as ge, TableHead as _e, TableRow as T, TextField as E, Typography as D } from "@mui/material";
12
+ import { showToast as O } from "@/common/toaster/toaster";
13
+ import { useNavigate as k, useParams as A } from "react-router-dom";
14
+ import j from "@mui/icons-material/SaveRounded";
15
+ //#region src/views/PaymentCreatePage.jsx
16
+ function M(e) {
17
+ if (!e) return null;
18
+ let t = new Date(e).getTime();
19
+ if (Number.isNaN(t)) return null;
20
+ let n = Date.now() - t;
21
+ return Math.max(0, Math.floor(n / (24 * 3600 * 1e3)));
22
+ }
23
+ function N() {
24
+ let { memberId: N } = A(), F = k(), I = ne(i()?.currencyCode), L = a().has("view.manage.productManagement.dues"), [R, z] = f(""), [B, ve] = f(""), [ye, V] = f(0), [H, U] = f(null), [be, W] = f(!1), G = ae(), xe = (/* @__PURE__ */ new Date()).toISOString().substring(0, 10), [K, q] = f({
25
+ id: ce(),
26
+ paymentDate: xe,
27
+ paymentMode: "CASH",
28
+ collectingNow: "",
29
+ notes: ""
30
+ });
31
+ async function Se() {
32
+ if (!N) {
33
+ U(null), W(!1), V(0);
34
+ return;
35
+ }
36
+ if (!L) {
37
+ U(null), V(0), W(!1);
38
+ return;
39
+ }
40
+ W(!0);
41
+ try {
42
+ let [n, r] = await Promise.all([t(N).catch(() => null), e().catch(() => [])]);
43
+ U(n);
44
+ let i = (r ?? []).find((e) => e.memberId === N);
45
+ V(Number(i ? i.totalDue : n?.totalDue ?? 0));
46
+ } catch (e) {
47
+ O({
48
+ message: e?.response?.data?.message ?? e?.message ?? "Failed to load member dues",
49
+ type: "error"
50
+ });
51
+ } finally {
52
+ W(!1);
53
+ }
54
+ }
55
+ ee("update.manage.productManagement.payment", () => {
56
+ Se(), q((e) => ({
57
+ ...e,
58
+ collectingNow: ""
59
+ }));
60
+ }, [N]);
61
+ let J = Number(H?.totalDue ?? 0), Ce = Number(K.collectingNow || 0), Y = Math.min(Math.max(Ce, 0), J), X = Math.max(J - Y, 0), we = M(H?.oldestDueDate), Te = M(H?.lastSaleDate), Z = !!N && J > 0 && L, Q = d(() => {
62
+ let e = {
63
+ member: N ? "" : "No member selected",
64
+ paymentDate: re(K.paymentDate, {
65
+ required: !0,
66
+ label: "Payment date"
67
+ }),
68
+ collectingNow: ie(K.collectingNow, "Amount", { required: !0 })
69
+ };
70
+ return !e.collectingNow && J > 0 && Number(K.collectingNow) > J && (e.collectingNow = `Cannot collect more than the outstanding due (${c(J)}).`), e;
71
+ }, [
72
+ N,
73
+ K.paymentDate,
74
+ K.collectingNow,
75
+ J
76
+ ]), $ = Z && s(Q);
77
+ async function Ee() {
78
+ if (!$) {
79
+ G.markAllTouched(), z("Please fix the highlighted fields.");
80
+ return;
81
+ }
82
+ try {
83
+ await n({
84
+ id: K.id,
85
+ memberId: N,
86
+ amount: Number(Y.toFixed(2)),
87
+ paymentDate: K.paymentDate,
88
+ paymentMode: K.paymentMode || null,
89
+ notes: K.notes || null,
90
+ allocations: null
91
+ }), O({
92
+ message: B ? `Payment recorded for ${B}. Applied to their oldest sales first.` : "Payment recorded. Applied to the oldest sales first.",
93
+ type: "success"
94
+ }), F("/ui/medplat/manage/pm/payments");
95
+ } catch (e) {
96
+ let t = e?.response?.data?.message ?? e?.message ?? "Failed to record payment";
97
+ z(t), O({
98
+ message: t,
99
+ type: "error"
100
+ });
101
+ }
102
+ }
103
+ return /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ p(o, {}), /* @__PURE__ */ p(te, {
104
+ perm: "update.manage.productManagement.payment",
105
+ title: "You don’t have permission to collect payments",
106
+ children: /* @__PURE__ */ m(r, {
107
+ title: "Collect Payment",
108
+ subtitle: "Collect payment for what a customer owes. Payments are matched to sales in order received.",
109
+ actions: /* @__PURE__ */ m(S, {
110
+ direction: "row",
111
+ spacing: 1,
112
+ children: [/* @__PURE__ */ p(_, {
113
+ variant: "outlined",
114
+ onClick: () => F("/ui/medplat/manage/pm/payments"),
115
+ children: "Cancel"
116
+ }), /* @__PURE__ */ p(_, {
117
+ variant: "contained",
118
+ startIcon: /* @__PURE__ */ p(j, {}),
119
+ disabled: !$,
120
+ onClick: () => void Ee(),
121
+ children: "Confirm Collection"
122
+ })]
123
+ }),
124
+ children: [
125
+ R ? /* @__PURE__ */ p(h, {
126
+ severity: "error",
127
+ sx: { mb: 2 },
128
+ children: R
129
+ }) : null,
130
+ L ? null : /* @__PURE__ */ p(h, {
131
+ severity: "warning",
132
+ sx: { mb: 2 },
133
+ children: "You don’t have access to view outstanding dues, so this collection flow can’t determine how much is owed. Ask an admin to grant the dues permission to collect payments here."
134
+ }),
135
+ /* @__PURE__ */ p(v, {
136
+ sx: {
137
+ borderRadius: 4,
138
+ mb: 2
139
+ },
140
+ children: /* @__PURE__ */ m(y, { children: [/* @__PURE__ */ p(D, {
141
+ variant: "h6",
142
+ sx: {
143
+ fontWeight: 800,
144
+ mb: 2
145
+ },
146
+ children: "Customer"
147
+ }), N ? /* @__PURE__ */ p(u, {
148
+ memberId: N,
149
+ previousDue: ye,
150
+ currencySymbol: I,
151
+ onLoad: (e) => ve(e?.name ?? "")
152
+ }) : /* @__PURE__ */ p(h, {
153
+ severity: "warning",
154
+ children: "No member selected"
155
+ })] })
156
+ }),
157
+ N ? /* @__PURE__ */ m(se, { children: [
158
+ /* @__PURE__ */ p(v, {
159
+ sx: {
160
+ borderRadius: 4,
161
+ mb: 2
162
+ },
163
+ children: /* @__PURE__ */ m(y, { children: [be ? /* @__PURE__ */ p(fe, { sx: { mb: 2 } }) : null, /* @__PURE__ */ p(P, {
164
+ total: J,
165
+ oldestDueDays: we,
166
+ oldestDueDate: H?.oldestDueDate,
167
+ lastSaleDays: Te,
168
+ lastSaleDate: H?.lastSaleDate,
169
+ currency: I
170
+ })] })
171
+ }),
172
+ /* @__PURE__ */ p(v, {
173
+ sx: {
174
+ borderRadius: 4,
175
+ mb: 2
176
+ },
177
+ children: /* @__PURE__ */ m(y, { children: [
178
+ /* @__PURE__ */ m(S, {
179
+ direction: "row",
180
+ justifyContent: "space-between",
181
+ alignItems: "center",
182
+ sx: { mb: 2 },
183
+ children: [/* @__PURE__ */ p(D, {
184
+ variant: "h6",
185
+ sx: { fontWeight: 800 },
186
+ children: "Due Breakdown"
187
+ }), /* @__PURE__ */ m(D, {
188
+ variant: "caption",
189
+ color: "text.secondary",
190
+ children: [
191
+ (H?.openSales ?? []).length,
192
+ " ",
193
+ (H?.openSales ?? []).length === 1 ? "open sale" : "open sales",
194
+ " ",
195
+ "· oldest first"
196
+ ]
197
+ })]
198
+ }),
199
+ /* @__PURE__ */ p(b, { sx: { mb: 1 } }),
200
+ J <= 0 ? /* @__PURE__ */ p(h, {
201
+ severity: "success",
202
+ sx: { mt: 1 },
203
+ children: "No outstanding dues for this member — nothing to collect."
204
+ }) : /* @__PURE__ */ p(ge, { children: /* @__PURE__ */ m(C, {
205
+ size: "small",
206
+ children: [/* @__PURE__ */ p(_e, { children: /* @__PURE__ */ m(T, { children: [
207
+ /* @__PURE__ */ p(w, {
208
+ sx: { fontWeight: 800 },
209
+ children: "Sale Date"
210
+ }),
211
+ /* @__PURE__ */ p(w, {
212
+ sx: { fontWeight: 800 },
213
+ children: "Items"
214
+ }),
215
+ /* @__PURE__ */ p(w, {
216
+ sx: { fontWeight: 800 },
217
+ align: "right",
218
+ children: "Sale"
219
+ }),
220
+ /* @__PURE__ */ p(w, {
221
+ sx: { fontWeight: 800 },
222
+ align: "right",
223
+ children: "Paid"
224
+ }),
225
+ /* @__PURE__ */ p(w, {
226
+ sx: { fontWeight: 800 },
227
+ align: "right",
228
+ children: "Due"
229
+ })
230
+ ] }) }), /* @__PURE__ */ p(he, { children: (H?.openSales ?? []).map((e) => /* @__PURE__ */ m(T, {
231
+ hover: !0,
232
+ children: [
233
+ /* @__PURE__ */ p(w, { children: /* @__PURE__ */ m(S, {
234
+ direction: "row",
235
+ spacing: 1,
236
+ alignItems: "baseline",
237
+ children: [/* @__PURE__ */ p(D, {
238
+ variant: "body2",
239
+ children: l(e.saleDate)
240
+ }), /* @__PURE__ */ m(D, {
241
+ variant: "caption",
242
+ color: "text.secondary",
243
+ children: [
244
+ "(",
245
+ M(e.saleDate),
246
+ "d ago)"
247
+ ]
248
+ })]
249
+ }) }),
250
+ /* @__PURE__ */ p(w, { children: /* @__PURE__ */ p(S, {
251
+ direction: "row",
252
+ spacing: .5,
253
+ flexWrap: "wrap",
254
+ children: (e.items ?? []).map((e) => /* @__PURE__ */ p(le, {
255
+ size: "small",
256
+ variant: "outlined",
257
+ label: `${e.productName} × ${e.quantity}`,
258
+ sx: {
259
+ mr: .5,
260
+ mb: .5
261
+ }
262
+ }, e.id))
263
+ }) }),
264
+ /* @__PURE__ */ m(w, {
265
+ align: "right",
266
+ sx: { fontVariantNumeric: "tabular-nums" },
267
+ children: [I, c(e.totalAmount)]
268
+ }),
269
+ /* @__PURE__ */ m(w, {
270
+ align: "right",
271
+ sx: {
272
+ fontVariantNumeric: "tabular-nums",
273
+ color: "text.secondary"
274
+ },
275
+ children: [I, c(e.paidAmount)]
276
+ }),
277
+ /* @__PURE__ */ m(w, {
278
+ align: "right",
279
+ sx: {
280
+ fontVariantNumeric: "tabular-nums",
281
+ fontWeight: 700,
282
+ color: "warning.dark"
283
+ },
284
+ children: [I, c(e.dueAmount)]
285
+ })
286
+ ]
287
+ }, e.id)) })]
288
+ }) })
289
+ ] })
290
+ }),
291
+ Z ? /* @__PURE__ */ p(v, {
292
+ sx: {
293
+ borderRadius: 4,
294
+ bgcolor: "grey.50",
295
+ mb: 3
296
+ },
297
+ children: /* @__PURE__ */ m(y, { children: [
298
+ /* @__PURE__ */ m(S, {
299
+ direction: {
300
+ xs: "column",
301
+ md: "row"
302
+ },
303
+ spacing: 2,
304
+ children: [
305
+ /* @__PURE__ */ p(E, {
306
+ required: !0,
307
+ size: "small",
308
+ type: "date",
309
+ label: "Payment Date",
310
+ sx: { flex: 1 },
311
+ InputLabelProps: { shrink: !0 },
312
+ value: K.paymentDate,
313
+ onChange: (e) => q({
314
+ ...K,
315
+ paymentDate: e.target.value
316
+ }),
317
+ onBlur: G.onBlur("paymentDate"),
318
+ error: G.show("paymentDate") && !!Q.paymentDate,
319
+ helperText: G.show("paymentDate") ? Q.paymentDate : ""
320
+ }),
321
+ /* @__PURE__ */ m(x, {
322
+ size: "small",
323
+ sx: { flex: 1 },
324
+ children: [/* @__PURE__ */ p(de, { children: "Payment Mode" }), /* @__PURE__ */ p(me, {
325
+ label: "Payment Mode",
326
+ value: K.paymentMode,
327
+ onChange: (e) => q({
328
+ ...K,
329
+ paymentMode: e.target.value
330
+ }),
331
+ children: oe.map((e) => /* @__PURE__ */ p(pe, {
332
+ value: e.value,
333
+ children: e.label
334
+ }, e.value))
335
+ })]
336
+ }),
337
+ /* @__PURE__ */ p(E, {
338
+ size: "small",
339
+ label: "Notes",
340
+ sx: { flex: 2 },
341
+ value: K.notes,
342
+ onChange: (e) => q({
343
+ ...K,
344
+ notes: e.target.value
345
+ })
346
+ })
347
+ ]
348
+ }),
349
+ /* @__PURE__ */ p(b, { sx: { my: 2 } }),
350
+ /* @__PURE__ */ m(S, {
351
+ spacing: 1.25,
352
+ children: [
353
+ /* @__PURE__ */ m(S, {
354
+ direction: "row",
355
+ justifyContent: "space-between",
356
+ alignItems: "baseline",
357
+ children: [/* @__PURE__ */ p(D, {
358
+ variant: "body2",
359
+ color: "text.secondary",
360
+ children: "Total Due"
361
+ }), /* @__PURE__ */ m(D, {
362
+ variant: "h5",
363
+ sx: {
364
+ fontWeight: 800,
365
+ fontVariantNumeric: "tabular-nums",
366
+ color: J > 0 ? "warning.dark" : "text.primary"
367
+ },
368
+ children: [I, c(J)]
369
+ })]
370
+ }),
371
+ /* @__PURE__ */ m(S, {
372
+ direction: "row",
373
+ justifyContent: "space-between",
374
+ alignItems: "center",
375
+ spacing: 2,
376
+ children: [/* @__PURE__ */ p(D, {
377
+ variant: "body2",
378
+ color: "text.secondary",
379
+ sx: { flexShrink: 0 },
380
+ children: "Amount Collecting Now"
381
+ }), /* @__PURE__ */ p(E, {
382
+ required: !0,
383
+ size: "small",
384
+ type: "number",
385
+ inputProps: {
386
+ step: "0.01",
387
+ min: 0,
388
+ max: J,
389
+ style: {
390
+ textAlign: "right",
391
+ fontWeight: 700
392
+ }
393
+ },
394
+ InputProps: { startAdornment: /* @__PURE__ */ p(ue, {
395
+ position: "start",
396
+ children: I
397
+ }) },
398
+ sx: { width: 220 },
399
+ placeholder: "0.00",
400
+ value: K.collectingNow,
401
+ onChange: (e) => q({
402
+ ...K,
403
+ collectingNow: e.target.value
404
+ }),
405
+ onBlur: G.onBlur("collectingNow"),
406
+ error: G.show("collectingNow") && !!Q.collectingNow,
407
+ helperText: G.show("collectingNow") ? Q.collectingNow : "Partial amounts accepted"
408
+ })]
409
+ }),
410
+ /* @__PURE__ */ p(b, { sx: { my: .5 } }),
411
+ /* @__PURE__ */ m(S, {
412
+ direction: "row",
413
+ justifyContent: "space-between",
414
+ alignItems: "baseline",
415
+ children: [/* @__PURE__ */ p(D, {
416
+ variant: "body2",
417
+ color: "text.secondary",
418
+ children: "Remaining Due After"
419
+ }), /* @__PURE__ */ m(D, {
420
+ variant: "h5",
421
+ sx: {
422
+ fontWeight: 800,
423
+ fontVariantNumeric: "tabular-nums",
424
+ color: X > 0 ? "warning.dark" : "success.dark"
425
+ },
426
+ children: [I, c(X)]
427
+ })]
428
+ })
429
+ ]
430
+ })
431
+ ] })
432
+ }) : null
433
+ ] }) : null
434
+ ]
435
+ })
436
+ })] });
437
+ }
438
+ function P({ total: e, oldestDueDays: t, oldestDueDate: n, lastSaleDays: r, lastSaleDate: i, currency: a = "₹" }) {
439
+ let o = (e, t, n, r) => /* @__PURE__ */ m(g, {
440
+ sx: {
441
+ flex: 1,
442
+ p: 1.5,
443
+ borderRadius: 2,
444
+ bgcolor: "background.paper",
445
+ border: 1,
446
+ borderColor: "divider",
447
+ textAlign: "left"
448
+ },
449
+ children: [
450
+ /* @__PURE__ */ p(D, {
451
+ variant: "caption",
452
+ color: "text.secondary",
453
+ children: e
454
+ }),
455
+ /* @__PURE__ */ p(D, {
456
+ variant: "h6",
457
+ sx: {
458
+ fontWeight: 800,
459
+ color: r,
460
+ fontVariantNumeric: "tabular-nums"
461
+ },
462
+ children: t
463
+ }),
464
+ n ? /* @__PURE__ */ p(D, {
465
+ variant: "caption",
466
+ color: "text.secondary",
467
+ children: n
468
+ }) : null
469
+ ]
470
+ });
471
+ return /* @__PURE__ */ m(S, {
472
+ direction: {
473
+ xs: "column",
474
+ md: "row"
475
+ },
476
+ spacing: 1.5,
477
+ children: [
478
+ o("Total Due", `${a}${c(e)}`, null, e > 0 ? "warning.dark" : "text.primary"),
479
+ o("Last Sale", r == null ? "—" : `${r} day${r === 1 ? "" : "s"} ago`, i ? l(i) : "No prior sale", "text.primary"),
480
+ o("Due Since", t == null ? "—" : `${t} day${t === 1 ? "" : "s"}`, n ? l(n) : "No open sales", t != null && t >= 30 ? "error.dark" : "text.primary")
481
+ ]
482
+ });
483
+ }
484
+ //#endregion
485
+ export { N as default };
486
+
487
+ //# sourceMappingURL=PaymentCreatePage-Ci3ERnby.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaymentCreatePage-Ci3ERnby.js","names":[],"sources":["../src/views/PaymentCreatePage.jsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useNavigate, useParams } from \"react-router-dom\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n Divider,\n FormControl,\n InputAdornment,\n InputLabel,\n LinearProgress,\n MenuItem,\n Select,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\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, usePmPermissions } from \"@pm/utils/permissions\";\nimport {\n createPayment,\n getMemberDuesDetails,\n getMemberOutstandingDues,\n} from \"@pm/services/pmApi\";\nimport MemberProfileCard from \"@pm/components/MemberProfileCard\";\nimport { PAYMENT_MODES } from \"@pm/utils/constants\";\nimport { currencySymbol } from \"@pm/utils/currency\";\nimport { usePmSettings } from \"@pm/utils/settingsStore\";\nimport { formatDate, formatNumber } from \"@pm/utils/format\";\nimport {\n isClean,\n validatePastOrTodayDate,\n validatePositiveNumber,\n} from \"@pm/utils/validation\";\nimport { useFieldErrors } from \"@pm/utils/useFieldErrors\";\n\nfunction daysSince(value) {\n if (!value) return null;\n const ms = new Date(value).getTime();\n if (Number.isNaN(ms)) return null;\n const diff = Date.now() - ms;\n return Math.max(0, Math.floor(diff / (24 * 3600 * 1000)));\n}\n\nexport default function PaymentCreatePage() {\n const { memberId } = useParams();\n const navigate = useNavigate();\n const settings = usePmSettings();\n const cur = currencySymbol(settings?.currencyCode);\n const perms = usePmPermissions();\n // Dues breakdown drives both the panel and the collect form's totalDue.\n // Without the dues permission we can't fetch it, so the page surfaces a\n // hard-stop alert and disables Confirm Collection.\n const canSeeDues = perms.has(\"view.manage.productManagement.dues\");\n const [error, setError] = useState(\"\");\n const [memberName, setMemberName] = useState(\"\");\n const [previousDue, setPreviousDue] = useState(0);\n const [duesDetails, setDuesDetails] = useState(null);\n const [detailsLoading, setDetailsLoading] = useState(false);\n const fieldErrors = useFieldErrors();\n const today = new Date().toISOString().substring(0, 10);\n const [form, setForm] = useState({\n id: uuidv4(),\n paymentDate: today,\n paymentMode: \"CASH\",\n collectingNow: \"\",\n notes: \"\",\n });\n\n async function loadMemberDues() {\n if (!memberId) {\n setDuesDetails(null);\n setDetailsLoading(false);\n setPreviousDue(0);\n return;\n }\n if (!canSeeDues) {\n // No dues access — leave panels empty. The hard-stop alert below\n // tells the operator to ask for the perm.\n setDuesDetails(null);\n setPreviousDue(0);\n setDetailsLoading(false);\n return;\n }\n setDetailsLoading(true);\n try {\n const [details, dues] = await Promise.all([\n getMemberDuesDetails(memberId).catch(() => null),\n getMemberOutstandingDues().catch(() => []),\n ]);\n setDuesDetails(details);\n const match = (dues ?? []).find((d) => d.memberId === memberId);\n setPreviousDue(\n match ? Number(match.totalDue) : Number(details?.totalDue ?? 0),\n );\n } catch (err) {\n showToast({\n message:\n err?.response?.data?.message ??\n err?.message ??\n \"Failed to load member dues\",\n type: \"error\",\n });\n } finally {\n setDetailsLoading(false);\n }\n }\n\n usePermissionedEffect(\n \"update.manage.productManagement.payment\",\n () => {\n void loadMemberDues();\n setForm((f) => ({ ...f, collectingNow: \"\" }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [memberId],\n );\n\n // -------- Money math --------\n const totalDue = Number(duesDetails?.totalDue ?? 0);\n const collectedRaw = Number(form.collectingNow || 0);\n const collected = Math.min(Math.max(collectedRaw, 0), totalDue);\n const remainingAfter = Math.max(totalDue - collected, 0);\n\n const oldestDueDays = daysSince(duesDetails?.oldestDueDate);\n const lastSaleDays = daysSince(duesDetails?.lastSaleDate);\n\n // Collection only makes sense when there's an outstanding balance — once\n // it's zero the collect form is hidden entirely (a \"Nothing to collect\"\n // alert is shown instead) and the Save button stays disabled.\n const canCollect = !!memberId && totalDue > 0 && canSeeDues;\n\n // -------- Validation --------\n const formErrors = useMemo(() => {\n const errs = {\n member: memberId ? \"\" : \"No member selected\",\n paymentDate: validatePastOrTodayDate(form.paymentDate, {\n required: true,\n label: \"Payment date\",\n }),\n collectingNow: validatePositiveNumber(form.collectingNow, \"Amount\", {\n required: true,\n }),\n };\n if (\n !errs.collectingNow &&\n totalDue > 0 &&\n Number(form.collectingNow) > totalDue\n ) {\n errs.collectingNow = `Cannot collect more than the outstanding due (${formatNumber(totalDue)}).`;\n }\n return errs;\n }, [memberId, form.paymentDate, form.collectingNow, totalDue]);\n const formIsValid = canCollect && isClean(formErrors);\n\n async function save() {\n if (!formIsValid) {\n fieldErrors.markAllTouched();\n setError(\"Please fix the highlighted fields.\");\n return;\n }\n try {\n await createPayment({\n id: form.id,\n memberId,\n amount: Number(collected.toFixed(2)),\n paymentDate: form.paymentDate,\n paymentMode: form.paymentMode || null,\n notes: form.notes || null,\n allocations: null,\n });\n showToast({\n message: memberName\n ? `Payment recorded for ${memberName}. Applied to their oldest sales first.`\n : \"Payment recorded. Applied to the oldest sales first.\",\n type: \"success\",\n });\n navigate(\"/ui/medplat/manage/pm/payments\");\n } catch (err) {\n const message =\n err?.response?.data?.message ??\n err?.message ??\n \"Failed to record payment\";\n setError(message);\n showToast({ message, type: \"error\" });\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard\n perm={\"update.manage.productManagement.payment\"}\n title=\"You don’t have permission to collect payments\"\n >\n <PmPageShell\n title=\"Collect Payment\"\n subtitle=\"Collect payment for what a customer owes. Payments are matched to sales in order received.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n onClick={() => navigate(\"/ui/medplat/manage/pm/payments\")}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n startIcon={<SaveRoundedIcon />}\n disabled={!formIsValid}\n onClick={() => void save()}\n >\n Confirm Collection\n </Button>\n </Stack>\n }\n >\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n\n {!canSeeDues ? (\n <Alert severity=\"warning\" sx={{ mb: 2 }}>\n You don’t have access to view outstanding dues, so this collection\n flow can’t determine how much is owed. Ask an admin to grant the\n dues permission to collect payments here.\n </Alert>\n ) : null}\n\n {/* ---------- Member profile (from URL) ---------- */}\n <Card sx={{ borderRadius: 4, mb: 2 }}>\n <CardContent>\n <Typography variant=\"h6\" sx={{ fontWeight: 800, mb: 2 }}>\n Customer\n </Typography>\n {memberId ? (\n <MemberProfileCard\n memberId={memberId}\n previousDue={previousDue}\n currencySymbol={cur}\n onLoad={(p) => setMemberName(p?.name ?? \"\")}\n />\n ) : (\n <Alert severity=\"warning\">No member selected</Alert>\n )}\n </CardContent>\n </Card>\n\n {/* ---------- Dues + collect (only when a member is selected) ---------- */}\n {memberId ? (\n <>\n <Card sx={{ borderRadius: 4, mb: 2 }}>\n <CardContent>\n {detailsLoading ? <LinearProgress sx={{ mb: 2 }} /> : null}\n <Grid3MetricStrip\n total={totalDue}\n oldestDueDays={oldestDueDays}\n oldestDueDate={duesDetails?.oldestDueDate}\n lastSaleDays={lastSaleDays}\n lastSaleDate={duesDetails?.lastSaleDate}\n currency={cur}\n />\n </CardContent>\n </Card>\n\n <Card sx={{ borderRadius: 4, mb: 2 }}>\n <CardContent>\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ mb: 2 }}\n >\n <Typography variant=\"h6\" sx={{ fontWeight: 800 }}>\n Due Breakdown\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {(duesDetails?.openSales ?? []).length}{\" \"}\n {(duesDetails?.openSales ?? []).length === 1\n ? \"open sale\"\n : \"open sales\"}{\" \"}\n · oldest first\n </Typography>\n </Stack>\n <Divider sx={{ mb: 1 }} />\n {totalDue <= 0 ? (\n <Alert severity=\"success\" sx={{ mt: 1 }}>\n No outstanding dues for this member — nothing to collect.\n </Alert>\n ) : (\n <TableContainer>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell sx={{ fontWeight: 800 }}>\n Sale Date\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }}>\n Items\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }} align=\"right\">\n Sale\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }} align=\"right\">\n Paid\n </TableCell>\n <TableCell sx={{ fontWeight: 800 }} align=\"right\">\n Due\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {(duesDetails?.openSales ?? []).map((sale) => (\n <TableRow key={sale.id} hover>\n <TableCell>\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"baseline\"\n >\n <Typography variant=\"body2\">\n {formatDate(sale.saleDate)}\n </Typography>\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n >\n ({daysSince(sale.saleDate)}d ago)\n </Typography>\n </Stack>\n </TableCell>\n <TableCell>\n <Stack\n direction=\"row\"\n spacing={0.5}\n flexWrap=\"wrap\"\n >\n {(sale.items ?? []).map((it) => (\n <Chip\n key={it.id}\n size=\"small\"\n variant=\"outlined\"\n label={`${it.productName} × ${it.quantity}`}\n sx={{ mr: 0.5, mb: 0.5 }}\n />\n ))}\n </Stack>\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {cur}\n {formatNumber(sale.totalAmount)}\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{\n fontVariantNumeric: \"tabular-nums\",\n color: \"text.secondary\",\n }}\n >\n {cur}\n {formatNumber(sale.paidAmount)}\n </TableCell>\n <TableCell\n align=\"right\"\n sx={{\n fontVariantNumeric: \"tabular-nums\",\n fontWeight: 700,\n color: \"warning.dark\",\n }}\n >\n {cur}\n {formatNumber(sale.dueAmount)}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n )}\n </CardContent>\n </Card>\n\n {/* ---------- Collection footer — only when there's something to collect ---------- */}\n {canCollect ? (\n <Card sx={{ borderRadius: 4, bgcolor: \"grey.50\", mb: 3 }}>\n <CardContent>\n <Stack direction={{ xs: \"column\", md: \"row\" }} spacing={2}>\n <TextField\n required\n size=\"small\"\n type=\"date\"\n label=\"Payment Date\"\n sx={{ flex: 1 }}\n InputLabelProps={{ shrink: true }}\n value={form.paymentDate}\n onChange={(e) =>\n setForm({ ...form, paymentDate: e.target.value })\n }\n onBlur={fieldErrors.onBlur(\"paymentDate\")}\n error={\n fieldErrors.show(\"paymentDate\") &&\n !!formErrors.paymentDate\n }\n helperText={\n fieldErrors.show(\"paymentDate\")\n ? formErrors.paymentDate\n : \"\"\n }\n />\n <FormControl size=\"small\" sx={{ flex: 1 }}>\n <InputLabel>Payment Mode</InputLabel>\n <Select\n label=\"Payment Mode\"\n value={form.paymentMode}\n onChange={(e) =>\n setForm({ ...form, paymentMode: e.target.value })\n }\n >\n {PAYMENT_MODES.map((m) => (\n <MenuItem key={m.value} value={m.value}>\n {m.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <TextField\n size=\"small\"\n label=\"Notes\"\n sx={{ flex: 2 }}\n value={form.notes}\n onChange={(e) =>\n setForm({ ...form, notes: e.target.value })\n }\n />\n </Stack>\n\n <Divider sx={{ my: 2 }} />\n\n <Stack spacing={1.25}>\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"baseline\"\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n Total Due\n </Typography>\n <Typography\n variant=\"h5\"\n sx={{\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n color:\n totalDue > 0 ? \"warning.dark\" : \"text.primary\",\n }}\n >\n {cur}\n {formatNumber(totalDue)}\n </Typography>\n </Stack>\n\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={2}\n >\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ flexShrink: 0 }}\n >\n Amount Collecting Now\n </Typography>\n <TextField\n required\n size=\"small\"\n type=\"number\"\n inputProps={{\n step: \"0.01\",\n min: 0,\n max: totalDue,\n style: { textAlign: \"right\", fontWeight: 700 },\n }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n {cur}\n </InputAdornment>\n ),\n }}\n sx={{ width: 220 }}\n placeholder=\"0.00\"\n value={form.collectingNow}\n onChange={(e) =>\n setForm({ ...form, collectingNow: e.target.value })\n }\n onBlur={fieldErrors.onBlur(\"collectingNow\")}\n error={\n fieldErrors.show(\"collectingNow\") &&\n !!formErrors.collectingNow\n }\n helperText={\n fieldErrors.show(\"collectingNow\")\n ? formErrors.collectingNow\n : \"Partial amounts accepted\"\n }\n />\n </Stack>\n\n <Divider sx={{ my: 0.5 }} />\n\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"baseline\"\n >\n <Typography variant=\"body2\" color=\"text.secondary\">\n Remaining Due After\n </Typography>\n <Typography\n variant=\"h5\"\n sx={{\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n color:\n remainingAfter > 0\n ? \"warning.dark\"\n : \"success.dark\",\n }}\n >\n {cur}\n {formatNumber(remainingAfter)}\n </Typography>\n </Stack>\n </Stack>\n </CardContent>\n </Card>\n ) : null}\n </>\n ) : null}\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n\n// Compact three-metric strip used inside the member dues panel.\nfunction Grid3MetricStrip({\n total,\n oldestDueDays,\n oldestDueDate,\n lastSaleDays,\n lastSaleDate,\n currency = \"₹\",\n}) {\n const cell = (label, value, sub, color) => (\n <Box\n sx={{\n flex: 1,\n p: 1.5,\n borderRadius: 2,\n bgcolor: \"background.paper\",\n border: 1,\n borderColor: \"divider\",\n textAlign: \"left\",\n }}\n >\n <Typography variant=\"caption\" color=\"text.secondary\">\n {label}\n </Typography>\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 800, color, fontVariantNumeric: \"tabular-nums\" }}\n >\n {value}\n </Typography>\n {sub ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {sub}\n </Typography>\n ) : null}\n </Box>\n );\n return (\n <Stack direction={{ xs: \"column\", md: \"row\" }} spacing={1.5}>\n {cell(\n \"Total Due\",\n `${currency}${formatNumber(total)}`,\n null,\n total > 0 ? \"warning.dark\" : \"text.primary\",\n )}\n {cell(\n \"Last Sale\",\n lastSaleDays == null\n ? \"—\"\n : `${lastSaleDays} day${lastSaleDays === 1 ? \"\" : \"s\"} ago`,\n lastSaleDate ? formatDate(lastSaleDate) : \"No prior sale\",\n \"text.primary\",\n )}\n {cell(\n \"Due Since\",\n oldestDueDays == null\n ? \"—\"\n : `${oldestDueDays} day${oldestDueDays === 1 ? \"\" : \"s\"}`,\n oldestDueDate ? formatDate(oldestDueDate) : \"No open sales\",\n oldestDueDays != null && oldestDueDays >= 30\n ? \"error.dark\"\n : \"text.primary\",\n )}\n </Stack>\n );\n}\n"],"mappings":"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"}