@feedmepos/mf-inventory-portal 1.1.9-dev.2 → 1.1.9

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 (48) hide show
  1. package/dist/{App-Bl6ZKF4W.js → App-D1UJ8NY1.js} +1 -1
  2. package/dist/{ApprovalView-FzJ8P0IL.js → ApprovalView-Cf6tfPo1.js} +22 -22
  3. package/dist/{BindingsDialog-DGSxOWVa.js → BindingsDialog-C4XnyllW.js} +2 -2
  4. package/dist/{BindingsPicker-C6FKHX3t.js → BindingsPicker-BW4-JT2R.js} +1 -1
  5. package/dist/{BindingsTable-CHLftqik.js → BindingsTable-DtDFatll.js} +1 -1
  6. package/dist/{ClosingDraftView-BcMFFxOs.js → ClosingDraftView-TtsNry0r.js} +2 -2
  7. package/dist/{ClosingTemplateView-CTZ0Im5J.js → ClosingTemplateView-NbwT6bOk.js} +2 -2
  8. package/dist/{DeliveryOrderPrintPreview-CnFrbjUj.js → DeliveryOrderPrintPreview-ujSpOCKj.js} +8 -8
  9. package/dist/{FmFilterableMenuOptions.vue_vue_type_script_setup_true_lang-Blboq4ih.js → FmFilterableMenuOptions.vue_vue_type_script_setup_true_lang-AGOtUG41.js} +12 -12
  10. package/dist/{FmMultiselectDialog-DlSHfTNw.js → FmMultiselectDialog-c2e1Pisp.js} +1 -1
  11. package/dist/{FmUnitInput.vue_vue_type_script_setup_true_lang-iQKBGj46.js → FmUnitInput.vue_vue_type_script_setup_true_lang-BNxA-pQp.js} +25 -25
  12. package/dist/{IngredientBindedItem.vue_vue_type_script_setup_true_lang-BPVvemT9.js → IngredientBindedItem.vue_vue_type_script_setup_true_lang-HkmovqY5.js} +1 -1
  13. package/dist/{IngredientGroupView--m_tFqXz.js → IngredientGroupView-CnSZ_jFk.js} +2 -2
  14. package/dist/{IngredientsView-BJHKoWFU.js → IngredientsView-DjWSaEi8.js} +4 -4
  15. package/dist/{IntegrationView-D-6dYaoz.js → IntegrationView-CJJKfJDQ.js} +83 -83
  16. package/dist/{InventoryBindingForm-BxXRhkoy.js → InventoryBindingForm-DhnOLZJo.js} +1 -1
  17. package/dist/{InventoryBindingForm.vue_vue_type_script_setup_true_lang-CcFaix3Z.js → InventoryBindingForm.vue_vue_type_script_setup_true_lang-CgLA6KH7.js} +3 -3
  18. package/dist/{InventoryBindingSummary-Do1L4Kap.js → InventoryBindingSummary-_DhLtjfm.js} +1 -1
  19. package/dist/{NumberPrecisionInput.vue_vue_type_script_setup_true_lang-BE_Jy7Io.js → NumberPrecisionInput.vue_vue_type_script_setup_true_lang-BzlWBYz0.js} +1 -1
  20. package/dist/{PremiumBadge.vue_vue_type_script_setup_true_lang-DzgBomgA.js → PremiumBadge.vue_vue_type_script_setup_true_lang-DRlFOUlD.js} +7 -7
  21. package/dist/{PublishView-BnY9WgxW.js → PublishView-DjA8RTiy.js} +4 -4
  22. package/dist/{PurchaseOrderPrintPreview-Cuq1Zceg.js → PurchaseOrderPrintPreview-Bzdm9Vd-.js} +7 -7
  23. package/dist/{ReceiveRequestView-KLZlhvM6.js → ReceiveRequestView-CJ7oiJBQ.js} +60 -60
  24. package/dist/{RecipeView-CBZne8rg.js → RecipeView--lcBWmZ3.js} +3 -3
  25. package/dist/StockView-BGNukBaV.js +1856 -0
  26. package/dist/{SupplierView-CrjALklK.js → SupplierView-BN1P0pgR.js} +3 -3
  27. package/dist/{TransferDetails.vue_vue_type_script_setup_true_lang-D4tM1-2p.js → TransferDetails.vue_vue_type_script_setup_true_lang-CiK1nGyN.js} +5 -5
  28. package/dist/{TransferTemplateView-CZcn88V4.js → TransferTemplateView-P25c3cZ-.js} +64 -64
  29. package/dist/{UnitView-DN13NHa8.js → UnitView-Umy1Vy0Y.js} +3 -3
  30. package/dist/{WarehouseView--6xAFFrZ.js → WarehouseView-DNDIdR4i.js} +1 -1
  31. package/dist/api/stock.d.ts +0 -2
  32. package/dist/{app-DR4vpC3Q.js → app-CgzMLhAo.js} +20966 -20819
  33. package/dist/app.d.ts +328 -71
  34. package/dist/app.js +1 -1
  35. package/dist/{decimal-DLlwiD5M.js → decimal-D_3mwNtr.js} +1 -1
  36. package/dist/{format-unit-display-DMEOal9Y.js → format-unit-display-Bu29MSxm.js} +17 -17
  37. package/dist/{index-Bb4SDHt3.js → index-BE8jrI3O.js} +1 -1
  38. package/dist/{index-D1CdY2Uk.js → index-D-fVJxc8.js} +1 -1
  39. package/dist/{stock-BxL1U8Yv.js → stock-JVbFNtIv.js} +27 -35
  40. package/dist/{supplier-CyfjkbzV.js → supplier-nx8WElIW.js} +1 -1
  41. package/dist/tsconfig.app.tsbuildinfo +1 -1
  42. package/dist/{use-ingredient-select-dialog-D1hBQJiq.js → use-ingredient-select-dialog-CX9_4vk_.js} +1 -1
  43. package/dist/{use-inventory-binding-dialog-BWUWgYax.js → use-inventory-binding-dialog-BfVLQDzr.js} +1 -1
  44. package/dist/views/stock/components/StockRecordCard.vue.d.ts +2 -6
  45. package/package.json +2 -2
  46. package/dist/StockView-DgWMvwqm.js +0 -2080
  47. package/dist/views/stock/components/dialog/AmendAdjustmentForm.vue.d.ts +0 -94
  48. package/dist/views/stock/components/dialog/AmendAdjustmentFormProps.d.ts +0 -3
@@ -0,0 +1,1856 @@
1
+ import { defineComponent as ie, ref as O, computed as U, resolveComponent as M, openBlock as $, createBlock as K, withCtx as j, createElementVNode as n, normalizeClass as ge, toDisplayString as h, createVNode as g, createElementBlock as H, Fragment as ee, renderList as le, unref as l, h as _e, watch as be, isRef as Ie, createCommentVNode as J, reactive as at, onMounted as qe, normalizeStyle as Qe, createTextVNode as ce, Teleport as rt, normalizeProps as we, mergeProps as $e } from "vue";
2
+ import { u as pe, W as lt, f as Te, h as it, a as Ue, F as Le, X as ut, Y as Me, j as de, P as ct, t as xe, V as De, A as dt, M as mt, T as fe, Z as pt, $ as Z, a0 as vt, a1 as Ne, m as ft, a2 as yt, a3 as _t, a4 as kt, a5 as Xe, Q as Y, a6 as ht, s as Je, a7 as ke, a8 as gt, a9 as bt, o as Ae, l as ze, p as xt, c as St, aa as Ft, ab as wt, ac as $t, ad as At, ae as Ct, B as Vt, _ as Bt, C as Mt, E as Dt, G as Ye } from "./app-CgzMLhAo.js";
3
+ import { u as Pe, a as Ee } from "./stock-JVbFNtIv.js";
4
+ import { g as Se } from "./decimal-D_3mwNtr.js";
5
+ import { e as jt, u as Ze, i as et, _ as Ke } from "./PremiumBadge.vue_vue_type_script_setup_true_lang-DRlFOUlD.js";
6
+ import { _ as je, S as Ce, g as tt } from "./StockForecast.vue_vue_type_style_index_0_lang-KLXSWvo5.js";
7
+ import { _ as It } from "./PreviewBadge.vue_vue_type_script_setup_true_lang-CRZiQHjx.js";
8
+ import { useI18n as ue, useCoreStore as Tt } from "@feedmepos/mf-common";
9
+ import { useSnackbar as ye, useDialog as nt, useProxiedModel as He, useBreakpoints as Ut } from "@feedmepos/ui-library";
10
+ import { defineStore as Pt } from "pinia";
11
+ import { u as Et } from "./use-inventory-binding-dialog-BfVLQDzr.js";
12
+ import { _ as Ht } from "./NumberPrecisionInput.vue_vue_type_script_setup_true_lang-BzlWBYz0.js";
13
+ import { E as Rt } from "./empty-placeholder-wf6-BWE8.js";
14
+ import "./array-Ca8T3f_G.js";
15
+ var he = /* @__PURE__ */ ((f) => (f.History = "History", f.Convert = "Convert", f.Adjust = "Adjust", f))(he || {});
16
+ const Ot = [
17
+ {
18
+ translationKey: "inventory.stock.action.history",
19
+ color: "text-neutral-700",
20
+ value: "History"
21
+ /* History */
22
+ }
23
+ ], Lt = [
24
+ {
25
+ translationKey: "inventory.stock.action.history",
26
+ color: "text-neutral-700",
27
+ value: "History"
28
+ /* History */
29
+ },
30
+ {
31
+ translationKey: "inventory.stock.action.convert",
32
+ color: "text-neutral-700",
33
+ value: "Convert"
34
+ /* Convert */
35
+ },
36
+ {
37
+ translationKey: "inventory.stock.action.adjust",
38
+ color: "text-neutral-700",
39
+ value: "Adjust"
40
+ /* Adjust */
41
+ }
42
+ ];
43
+ async function Nt(f) {
44
+ const i = `${(pe().currentLocation.name || "").replace(
45
+ / /g,
46
+ "_"
47
+ )}_${lt().format("DD_MM_YYYY_HHmm")}.xlsx`;
48
+ await jt(
49
+ [
50
+ {
51
+ name: "stock",
52
+ data: f,
53
+ columns: [
54
+ {
55
+ name: "Code",
56
+ selector: "code"
57
+ },
58
+ {
59
+ name: "Name",
60
+ selector: "name"
61
+ },
62
+ {
63
+ name: "Balance",
64
+ selector: (o) => {
65
+ const S = Fe(o, o.unit);
66
+ return S.type === "unit" ? Se(o.balance, o.unit, null, !1) : Se(o.balance, o.unit, S.measurement, !1);
67
+ }
68
+ },
69
+ {
70
+ name: "Unit",
71
+ selector: (o) => {
72
+ var _;
73
+ const S = Fe(o, o.unit);
74
+ return S.type === "unit" ? o.unit.abbrev : ((_ = o.unit.measurements.find((u) => u.id === S.measurement)) == null ? void 0 : _.abbrev) || "";
75
+ }
76
+ }
77
+ ]
78
+ }
79
+ ],
80
+ i
81
+ );
82
+ }
83
+ function Fe(f, y) {
84
+ const i = localStorage.getItem(`uom:${f._id}`);
85
+ return i ? i === y._id ? {
86
+ type: "unit"
87
+ } : y.measurements.find((o) => o.id === i) ? {
88
+ type: "measurement",
89
+ measurement: i
90
+ } : {
91
+ type: "unit"
92
+ } : f.trackingMeasurement && y.measurements.find((o) => o.id === f.trackingMeasurement) ? {
93
+ type: "measurement",
94
+ measurement: f.trackingMeasurement
95
+ } : {
96
+ type: "unit"
97
+ };
98
+ }
99
+ const zt = { class: "fm-typo-en-body-md-400 flex-grow" }, ot = /* @__PURE__ */ ie({
100
+ __name: "UnitDisplayControl",
101
+ props: {
102
+ unit: {},
103
+ sku: {},
104
+ amount: {},
105
+ defaultTrackingMeasurement: {}
106
+ },
107
+ setup(f) {
108
+ function y(x) {
109
+ return `uom:${x._id}`;
110
+ }
111
+ function i(x) {
112
+ const r = y(o.sku);
113
+ x ? localStorage.setItem(r, x) : localStorage.setItem(r, o.unit._id), S.value = Fe(o.sku, o.unit);
114
+ }
115
+ const o = f, S = O(Fe(o.sku, o.unit)), _ = U(() => {
116
+ const { measurements: x } = o.unit;
117
+ return [
118
+ {
119
+ label: `${Se(o.amount, o.unit)}`,
120
+ value: null
121
+ },
122
+ ...x.map(({ id: r }) => ({
123
+ label: `${Se(o.amount, o.unit, r)}`,
124
+ value: r
125
+ }))
126
+ ];
127
+ });
128
+ function u({ value: x }) {
129
+ return l(S).type === "unit" ? x === null : x === l(S).measurement;
130
+ }
131
+ const m = U(
132
+ () => {
133
+ var x;
134
+ return ((x = _.value.find((r) => u(r))) == null ? void 0 : x.label) ?? "";
135
+ }
136
+ ), w = O(!1);
137
+ return (x, r) => {
138
+ const t = M("FmIcon"), F = M("FmMenuItem"), C = M("FmMenu");
139
+ return $(), K(C, {
140
+ "stop-click-propagation": "",
141
+ onMenuChanged: r[0] || (r[0] = (k) => w.value = k)
142
+ }, {
143
+ "menu-button": j(() => [
144
+ n("button", {
145
+ type: "button",
146
+ class: ge([
147
+ "w-full text-left flex items-center gap-8 cursor-pointer fm-corner-radius-sm px-8 py-4 border bg-white",
148
+ w.value ? "border-fm-color-primary" : "border-fm-color-neutral-gray-100"
149
+ ])
150
+ }, [
151
+ n("div", zt, h(m.value), 1),
152
+ g(t, {
153
+ class: "text-fm-color-neutral-gray-400",
154
+ name: "expand_more"
155
+ })
156
+ ], 2)
157
+ ]),
158
+ default: j(() => [
159
+ ($(!0), H(ee, null, le(_.value, (k) => ($(), K(F, {
160
+ key: k.value ?? 0,
161
+ label: k.label,
162
+ "model-value": u(k),
163
+ onClick: (a) => i(k.value)
164
+ }, null, 8, ["label", "model-value", "onClick"]))), 128))
165
+ ]),
166
+ _: 1
167
+ });
168
+ };
169
+ }
170
+ }), Yt = { class: "whitespace-nowrap" }, Kt = /* @__PURE__ */ ie({
171
+ __name: "StockHeaderPreview",
172
+ setup(f) {
173
+ const { t: y } = ue();
174
+ return (i, o) => ($(), K(It, null, {
175
+ default: j(() => [
176
+ n("div", Yt, h(l(y)("inventory.stock.prediction.daysRemaining")), 1)
177
+ ]),
178
+ _: 1
179
+ }));
180
+ }
181
+ }), st = Pt("stockActions", () => {
182
+ const f = O(!1), y = pe(), i = Pe(), o = Ze(), S = ye(), _ = nt(), { t: u } = ue();
183
+ async function m() {
184
+ if (y._currentLocation) {
185
+ f.value = !0;
186
+ try {
187
+ await i.readStockBalance(), await i.readProductBalance(), await o.readStockEstimateBalance();
188
+ } catch {
189
+ S.open({
190
+ title: u("inventory.stock.error.title"),
191
+ message: u("inventory.stock.error.message"),
192
+ type: "error"
193
+ });
194
+ } finally {
195
+ f.value = !1;
196
+ }
197
+ }
198
+ }
199
+ const w = O();
200
+ async function x(a) {
201
+ var A, D, P;
202
+ if (!!!((D = (A = a.convert) == null ? void 0 : A.inventoryBindings) != null && D.length)) {
203
+ _.open({
204
+ title: u("inventory.stock.error.convert.title"),
205
+ message: u("inventory.stock.error.convert.message")
206
+ });
207
+ return;
208
+ }
209
+ const B = {
210
+ maxCount: ((P = i.productBalance.find(({ id: E }) => E === a._id)) == null ? void 0 : P.count) || 0,
211
+ sku: a,
212
+ show: !0,
213
+ "onUpdate:show"(E) {
214
+ w.value.show = E;
215
+ },
216
+ onSubmitted() {
217
+ m();
218
+ }
219
+ };
220
+ w.value = B;
221
+ }
222
+ const r = O();
223
+ async function t(a) {
224
+ const V = {
225
+ stock: a,
226
+ show: !0,
227
+ "onUpdate:show"(L) {
228
+ r.value.show = L;
229
+ },
230
+ onSubmitted() {
231
+ m();
232
+ }
233
+ };
234
+ r.value = V;
235
+ }
236
+ const F = O();
237
+ async function C(a) {
238
+ const V = {
239
+ sku: a,
240
+ show: !0,
241
+ "onUpdate:show"(L) {
242
+ F.value.show = L;
243
+ }
244
+ };
245
+ F.value = V;
246
+ }
247
+ function k(a, V) {
248
+ const L = Te(V);
249
+ switch (a) {
250
+ case he.History:
251
+ C(L);
252
+ return;
253
+ case he.Convert:
254
+ x(L);
255
+ return;
256
+ case he.Adjust:
257
+ t(L);
258
+ return;
259
+ }
260
+ }
261
+ return {
262
+ fetchStockBalance: m,
263
+ onActionMenu: k,
264
+ stockHistoryProps: F,
265
+ showSkuHistory: C,
266
+ convertSkuDialogProps: w,
267
+ adjustSkuDialogProps: r
268
+ };
269
+ });
270
+ function Gt() {
271
+ const f = pe(), y = st(), { t: i } = ue();
272
+ return {
273
+ columnDefs: [
274
+ {
275
+ accessorKey: "code",
276
+ header: () => i("inventory.stock.code"),
277
+ enableSorting: !0,
278
+ size: 300
279
+ },
280
+ {
281
+ accessorKey: "name",
282
+ header: () => i("inventory.stock.product"),
283
+ enableSorting: !0,
284
+ size: "auto"
285
+ },
286
+ {
287
+ id: "UOM",
288
+ header: () => i("inventory.stock.balance"),
289
+ cell(S) {
290
+ const _ = S.row.original, u = {
291
+ unit: _.unit,
292
+ sku: _,
293
+ amount: _.balance,
294
+ defaultTrackingMeasurement: _.trackingMeasurement ?? void 0
295
+ };
296
+ return _e(ot, u);
297
+ },
298
+ size: 180
299
+ },
300
+ {
301
+ accessorKey: "day",
302
+ id: "expireDate",
303
+ header: () => _e(Kt),
304
+ enableSorting: !0,
305
+ sortUndefined: "last",
306
+ cell(S) {
307
+ var r, t;
308
+ const _ = S.row.original.day, u = (r = S.row.original.thresholds) == null ? void 0 : r.low, m = (t = S.row.original.thresholds) == null ? void 0 : t.mid;
309
+ if (typeof _ != "number" || typeof u != "number" || typeof m != "number")
310
+ return _e(je, {
311
+ days: _
312
+ });
313
+ const w = _ <= u ? Ce.low : _ <= m ? Ce.mid : Ce.high;
314
+ return _e(je, {
315
+ days: _,
316
+ level: w
317
+ });
318
+ },
319
+ size: 200
320
+ },
321
+ {
322
+ id: "action",
323
+ cell(S) {
324
+ var _;
325
+ return it(
326
+ ((_ = f._currentLocation) == null ? void 0 : _.type) === "restaurant" ? Ot : Lt,
327
+ (u) => y.onActionMenu(u, S.row.original)
328
+ );
329
+ },
330
+ enableSorting: !1,
331
+ size: 40,
332
+ meta: {
333
+ cellClass: "",
334
+ headerClass: ""
335
+ }
336
+ }
337
+ ]
338
+ };
339
+ }
340
+ const Wt = {
341
+ context: null,
342
+ error: null,
343
+ isRequired(f = "This field is required") {
344
+ return `${this.context ?? ""}`.length === 0 && (this.error = f), this;
345
+ },
346
+ isString(f = "Must be a valid string") {
347
+ return this.error ? this : (typeof this.context != "string" && (this.error ?? (this.error = f)), this);
348
+ },
349
+ toInt() {
350
+ return this.error ? this : (this.context = +this.context, this);
351
+ },
352
+ isInteger(f = "Must be an integer") {
353
+ return this.error ? this : (this.toInt(), isNaN(this.context) && (this.error = f), this);
354
+ },
355
+ min(f, y) {
356
+ if (this.error) return this;
357
+ try {
358
+ typeof this.context == "number" ? +this.context < f && (this.error = y ?? `Must be at least ${f}`) : Object.prototype.hasOwnProperty.call(this.context, "length") ? +this.context.length < f && (this.error = y ?? `Must be at least ${f}`) : this.error = "Length cannot be determined";
359
+ } catch {
360
+ this.error = "Length cannot be determined";
361
+ }
362
+ return this;
363
+ },
364
+ max(f, y) {
365
+ if (this.error) return this;
366
+ try {
367
+ typeof this.context == "number" ? +this.context > f && (this.error = y ?? `Must be at most ${f}`) : "length" in this.context ? +this.context.length > f && (this.error = y ?? `Must be at most ${f}`) : this.error = "Length cannot be determined";
368
+ } catch {
369
+ this.error = "Length cannot be determined";
370
+ }
371
+ return this;
372
+ }
373
+ };
374
+ function Ge(f) {
375
+ return { ...Wt, context: f };
376
+ }
377
+ const qt = { class: "flex items-center" }, Qt = { class: "fm-typo-en-title-md-800" }, Xt = { class: "flex flex-col gap-24 w-full" }, Jt = { class: "flex flex-col gap-8" }, Zt = { class: "fm-typo-en-body-lg-600" }, en = { class: "fm-typo-en-body-lg-400 text-fm-color-typo-secondary flex-grow" }, tn = { class: "fm-typo-en-body-lg-600 text-fm-color-typo-error" }, nn = { class: "flex flex-col p-16 gap-8" }, on = { class: "flex flex-col gap-4" }, sn = { class: "fm-typo-en-body-md-600 text-fm-color-typo-secondary bg-fm-color-neutral-gray-100 border-b py-12 px-16" }, an = { class: "grid grid-cols-[auto_100px_100px_48px] xs:grid-cols-[auto_80px_120px_48px] gap-8 px-8 items-center" }, rn = { class: "xs:col-span-3" }, ln = { class: "flex gap-8" }, un = /* @__PURE__ */ ie({
378
+ __name: "ConvertSkuDialog",
379
+ props: {
380
+ sku: {},
381
+ maxCount: {},
382
+ show: { type: Boolean }
383
+ },
384
+ emits: ["update:show", "submitted"],
385
+ setup(f, { expose: y, emit: i }) {
386
+ const o = f, S = i, _ = Et(), u = Ue(), m = Ee(), w = ye(), { t: x } = ue(), r = O(0), t = O(null), F = U(() => u.skus), C = U(
387
+ () => {
388
+ var p, e;
389
+ return (((e = (p = o.sku) == null ? void 0 : p.convert) == null ? void 0 : e.inventoryBindings) ?? []).filter(
390
+ (s) => s.type === Le.enum.SKU
391
+ );
392
+ }
393
+ ), k = U({
394
+ get() {
395
+ return !!t.value;
396
+ },
397
+ set(p) {
398
+ p ? t.value = Te(C.value) : (t.value = null, r.value = Math.min(r.value, o.maxCount ?? 0));
399
+ }
400
+ }), a = O(!1);
401
+ be([() => o.show], ([p]) => {
402
+ p && (r.value = 0);
403
+ });
404
+ function V() {
405
+ te(o.sku, xe(r.value), t.value);
406
+ }
407
+ function L(p) {
408
+ if (t.value)
409
+ return !0;
410
+ const e = Ge(p).isInteger().max(o.maxCount ?? 0).error ?? "";
411
+ return e || !0;
412
+ }
413
+ function B(p) {
414
+ var d;
415
+ const e = (d = o.sku.convert) != null && d.measurement ? o.sku.unit.measurements.find((b) => {
416
+ var I;
417
+ return b.id === ((I = o.sku.convert) == null ? void 0 : I.measurement);
418
+ }) ?? null : null, s = Me(o.sku.unit, e), v = pt(+p);
419
+ return Ge(v).isInteger().max(s).error ? "Precision cannot be more than " + s : !0;
420
+ }
421
+ const A = U(
422
+ () => {
423
+ var p, e;
424
+ return (p = o.sku.convert) != null && p.measurement ? (e = o.sku.unit.measurements.find((s) => {
425
+ var v;
426
+ return s.id === ((v = o.sku.convert) == null ? void 0 : v.measurement);
427
+ })) == null ? void 0 : e.abbrev : o.sku.unit.abbrev;
428
+ }
429
+ ), D = U(() => {
430
+ var v, c;
431
+ const e = ut({
432
+ bindings: ((v = o.sku.convert) == null ? void 0 : v.inventoryBindings) ?? [],
433
+ skus: u.skus,
434
+ skuGroups: u.skuGroups,
435
+ recipes: u.recipes
436
+ }).inventoryBindings.filter((d) => "success" in d && d.success).map((d) => d).map((d) => d.binding);
437
+ return (c = t.value ?? e) == null ? void 0 : c.map((d) => {
438
+ var se, re, X, ne, Re;
439
+ const b = u.skus.find((ve) => ve._id === d.id), I = ((se = d.measurement) == null ? void 0 : se.abbrev) ?? ((re = b == null ? void 0 : b.unit) == null ? void 0 : re.abbrev), Q = (X = o.sku.convert) != null && X.measurement ? o.sku.unit.measurements.find((ve) => {
440
+ var Oe;
441
+ return ve.id === ((Oe = o.sku.convert) == null ? void 0 : Oe.measurement);
442
+ }) ?? null : null, oe = Me(o.sku.unit, Q), T = B(`${r.value}`) === !0 ? de(
443
+ ct(
444
+ d.amount,
445
+ xe(+r.value, oe)
446
+ ),
447
+ !1
448
+ ) : "0", z = (Re = (ne = t.value) == null ? void 0 : ne.find((ve) => ve.id === (b == null ? void 0 : b._id))) == null ? void 0 : Re.amount, W = z ? de(z, !1) : null;
449
+ return {
450
+ sku: b,
451
+ convertAmount: W ?? T,
452
+ abbrev: I
453
+ };
454
+ });
455
+ }), P = O();
456
+ y({
457
+ validateInputs: () => {
458
+ var p, e;
459
+ (e = (p = P.value) == null ? void 0 : p.validateInputs) == null || e.call(p);
460
+ },
461
+ resetInputsValidation: () => {
462
+ var p, e;
463
+ (e = (p = P.value) == null ? void 0 : p.resetInputsValidation) == null || e.call(p);
464
+ },
465
+ resetInputs: () => {
466
+ var p, e;
467
+ (e = (p = P.value) == null ? void 0 : p.resetInputs) == null || e.call(p);
468
+ }
469
+ });
470
+ const E = He(o, "show");
471
+ async function te(p, e, s) {
472
+ a.value = !0;
473
+ try {
474
+ await m.convertSku({
475
+ conversions: [
476
+ {
477
+ doc: p,
478
+ amount: e,
479
+ overrides: s == null ? void 0 : s.map((v) => ({
480
+ ...v,
481
+ amount: {
482
+ ...v.amount,
483
+ amount: -1 * Math.abs(v.amount.amount)
484
+ // ensure truly negative
485
+ }
486
+ }))
487
+ }
488
+ ]
489
+ }), S("update:show", !1), S("submitted");
490
+ } catch (v) {
491
+ w.open({
492
+ title: "Something went wrong",
493
+ message: `Cannot convert ${p.name}. Please try again.`,
494
+ type: "error"
495
+ }), console.error("error at converting stock amount", p, e, v);
496
+ } finally {
497
+ a.value = !1;
498
+ }
499
+ }
500
+ function q(p, e, s) {
501
+ const v = +e;
502
+ let c = s;
503
+ e.length > 0 && isFinite(v) ? c = s.map((d) => (d.id !== p || (d.amount = fe(v)), d)) : c = s.map((d) => (d.id !== p || (d.amount = { amount: 0, precision: 0 }), d)), t.value = c;
504
+ }
505
+ function N(p) {
506
+ const e = F.value.find((s) => s._id === p);
507
+ return e ? tt(e.unit, !0) : [];
508
+ }
509
+ function R(p, e) {
510
+ const s = N(p), v = s.find((c) => c.value === e) ?? s.find((c) => c.value === null);
511
+ return v ? {
512
+ ...v,
513
+ label: v.abbrev
514
+ } : null;
515
+ }
516
+ function G(p, e, s) {
517
+ let v;
518
+ if (e === null)
519
+ v = s.map((c) => (c.id !== p || (c.measurement = null), c)) ?? [];
520
+ else {
521
+ const c = F.value.find((d) => d._id === p);
522
+ v = s.map((d) => {
523
+ var b, I;
524
+ return d.id !== p || (d.measurement = (I = (b = c == null ? void 0 : c.unit) == null ? void 0 : b.measurements) == null ? void 0 : I.find((Q) => Q.id === e)), d;
525
+ }) ?? [];
526
+ }
527
+ t.value = v;
528
+ }
529
+ function ae(p, e) {
530
+ const s = e.filter((v) => v.id !== p);
531
+ t.value = s;
532
+ }
533
+ function me() {
534
+ const p = (t.value ?? []).map((e) => ({
535
+ ...e,
536
+ type: Le.enum.SKU
537
+ }));
538
+ _.promptIngredientsBinding(
539
+ p,
540
+ (e) => t.value = e,
541
+ o.sku._id
542
+ );
543
+ }
544
+ return be(
545
+ () => o.show,
546
+ (p) => {
547
+ p || (t.value = null, r.value = 0);
548
+ }
549
+ ), (p, e) => {
550
+ const s = M("FmTextField"), v = M("FmForm"), c = M("FmCard"), d = M("FmSwitch"), b = M("FmFormGroup"), I = M("FmSelect"), Q = M("FmButton"), oe = M("FmSideSheet");
551
+ return $(), K(oe, {
552
+ "dismiss-away": "",
553
+ modelValue: l(E),
554
+ "onUpdate:modelValue": e[3] || (e[3] = (T) => Ie(E) ? E.value = T : null),
555
+ "max-width": 500
556
+ }, {
557
+ "side-sheet-header": j(() => [
558
+ n("div", qt, [
559
+ n("div", Qt, h(l(x)("inventory.stock.convert.title", { name: p.sku.name })), 1)
560
+ ])
561
+ ]),
562
+ default: j(() => [
563
+ n("div", Xt, [
564
+ g(v, {
565
+ ref_key: "formRef",
566
+ ref: P,
567
+ onValidationSuccess: V
568
+ }, {
569
+ default: j(() => [
570
+ g(s, {
571
+ disabled: a.value,
572
+ "model-value": r.value,
573
+ "onUpdate:modelValue": e[0] || (e[0] = (T) => r.value = T),
574
+ label: l(x)("inventory.stock.convert.amount"),
575
+ rules: [L, B, l(De)(0)],
576
+ "append-text": A.value,
577
+ "helper-text": t.value ? void 0 : `Max ${p.maxCount} ${A.value}`
578
+ }, null, 8, ["disabled", "model-value", "label", "rules", "append-text", "helper-text"])
579
+ ]),
580
+ _: 1
581
+ }, 512),
582
+ g(c, {
583
+ variant: "outlined",
584
+ class: "p-16"
585
+ }, {
586
+ default: j(() => [
587
+ n("div", Jt, [
588
+ n("div", Zt, h(l(x)("inventory.stock.convert.deductionSummary")), 1),
589
+ ($(!0), H(ee, null, le(D.value, (T) => {
590
+ var z, W;
591
+ return $(), H("div", {
592
+ key: (z = T.sku) == null ? void 0 : z._id,
593
+ class: "flex items-center"
594
+ }, [
595
+ n("div", en, h((W = T.sku) == null ? void 0 : W.name), 1),
596
+ n("div", tn, " -" + h(T.convertAmount) + " " + h(T.abbrev), 1)
597
+ ]);
598
+ }), 128))
599
+ ])
600
+ ]),
601
+ _: 1
602
+ }),
603
+ g(c, { variant: "outlined" }, {
604
+ default: j(() => [
605
+ n("div", nn, [
606
+ g(d, {
607
+ value: "",
608
+ modelValue: k.value,
609
+ "onUpdate:modelValue": e[1] || (e[1] = (T) => k.value = T),
610
+ label: l(x)("inventory.stock.convert.overrideDeduction"),
611
+ "label-placement": "right"
612
+ }, null, 8, ["modelValue", "label"]),
613
+ k.value ? ($(), H(ee, { key: 0 }, [
614
+ g(b, {
615
+ modelValue: t.value,
616
+ rules: [l(dt)(1, "Must have at least one ingredient binding")]
617
+ }, null, 8, ["modelValue", "rules"]),
618
+ n("div", on, [
619
+ n("div", sn, h(l(x)("inventory.stock.convert.ingredients")), 1),
620
+ ($(!0), H(ee, null, le(t.value, (T) => ($(), K(b, {
621
+ key: T.id,
622
+ disabled: a.value,
623
+ modelValue: +l(de)(T.amount ?? { amount: 1, precision: 0 }),
624
+ rules: [
625
+ l(mt)(
626
+ F.value.find((z) => z._id === T.id).unit,
627
+ T.measurement
628
+ ),
629
+ l(De)(0)
630
+ ]
631
+ }, {
632
+ default: j(({ invalid: z }) => {
633
+ var W, se, re;
634
+ return [
635
+ n("div", an, [
636
+ n("div", rn, h((W = F.value.find((X) => X._id === T.id)) == null ? void 0 : W.name), 1),
637
+ g(s, {
638
+ class: "xs:col-span-2",
639
+ disabled: a.value,
640
+ modelValue: +l(de)(
641
+ T.amount ?? { amount: 1, precision: 0 }
642
+ ),
643
+ "onUpdate:modelValue": (X) => q(T.id, X, t.value ?? []),
644
+ invalid: z
645
+ }, null, 8, ["disabled", "modelValue", "onUpdate:modelValue", "invalid"]),
646
+ g(I, {
647
+ disabled: a.value,
648
+ class: "translate-y-[2px]",
649
+ items: N(T.id),
650
+ "model-value": (re = R(T.id, (se = T.measurement) == null ? void 0 : se.id)) == null ? void 0 : re.value,
651
+ "onUpdate:modelValue": (X) => G(T.id, X, t.value ?? []),
652
+ invalid: z
653
+ }, {
654
+ "helper-text": j(() => e[4] || (e[4] = [])),
655
+ _: 2
656
+ }, 1032, ["disabled", "items", "model-value", "onUpdate:modelValue", "invalid"]),
657
+ g(Q, {
658
+ disabled: a.value,
659
+ type: "button",
660
+ variant: "tertiary",
661
+ icon: "delete",
662
+ onClick: (X) => ae(T.id, t.value ?? [])
663
+ }, null, 8, ["disabled", "onClick"])
664
+ ])
665
+ ];
666
+ }),
667
+ _: 2
668
+ }, 1032, ["disabled", "modelValue", "rules"]))), 128))
669
+ ]),
670
+ n("div", null, [
671
+ g(Q, {
672
+ icon: "link",
673
+ label: l(x)("inventory.stock.convert.linkIngredient"),
674
+ variant: "plain",
675
+ onClick: me
676
+ }, null, 8, ["label"])
677
+ ])
678
+ ], 64)) : J("", !0)
679
+ ])
680
+ ]),
681
+ _: 1
682
+ })
683
+ ])
684
+ ]),
685
+ "side-sheet-footer": j(() => [
686
+ n("div", ln, [
687
+ g(Q, {
688
+ loading: a.value,
689
+ label: l(x)("inventory.stock.convert.convertButton"),
690
+ onClick: e[2] || (e[2] = (T) => {
691
+ var z, W;
692
+ return (W = (z = P.value) == null ? void 0 : z.validateInputs) == null ? void 0 : W.call(z);
693
+ })
694
+ }, null, 8, ["loading", "label"])
695
+ ])
696
+ ]),
697
+ _: 1
698
+ }, 8, ["modelValue"]);
699
+ };
700
+ }
701
+ });
702
+ function Ve(f, y) {
703
+ const i = xe(f, y);
704
+ return { ...i, amount: -i.amount };
705
+ }
706
+ function We(f, y) {
707
+ return xe(Math.abs(f), y);
708
+ }
709
+ const Be = {
710
+ [Z.enum.DAMAGE]: {
711
+ label: "Waste",
712
+ toAdjustmentAmount: Ve
713
+ },
714
+ [Z.enum.THEFT]: {
715
+ label: "Theft",
716
+ toAdjustmentAmount: Ve
717
+ },
718
+ [Z.enum.LOSE]: {
719
+ label: "Lose",
720
+ toAdjustmentAmount: Ve
721
+ },
722
+ [Z.enum.EXTRA]: {
723
+ label: "Extra",
724
+ toAdjustmentAmount: We
725
+ },
726
+ [Z.enum.PURCHASE]: {
727
+ label: "Purchase",
728
+ toAdjustmentAmount: We
729
+ }
730
+ }, cn = { class: "col-span-2 flex" }, dn = { class: "fm-typo-en-body-lg-600 flex-1" }, mn = /* @__PURE__ */ ie({
731
+ __name: "AdjustedItemForm",
732
+ props: {
733
+ modelValue: {},
734
+ disabled: { type: Boolean }
735
+ },
736
+ emits: ["update:modelValue", "click:delete"],
737
+ setup(f, { emit: y }) {
738
+ const i = f, o = y, S = U(
739
+ () => Object.keys(Be).map((r) => ({
740
+ label: vt(r),
741
+ value: r
742
+ }))
743
+ ), _ = U(() => tt(i.modelValue.doc.unit, !0)), u = U({
744
+ get() {
745
+ return i.modelValue.type ?? Z.enum.PURCHASE;
746
+ },
747
+ set(r) {
748
+ const t = {
749
+ ...i.modelValue
750
+ };
751
+ t.type = r;
752
+ const F = Ne(i.modelValue.amount);
753
+ t.amount = Be[t.type].toAdjustmentAmount(
754
+ +de(F),
755
+ F.precision
756
+ ), o("update:modelValue", t);
757
+ }
758
+ }), m = U({
759
+ get() {
760
+ const r = Ne(i.modelValue.amount);
761
+ return +de(r);
762
+ },
763
+ set(r) {
764
+ const t = {
765
+ ...i.modelValue
766
+ }, F = fe(r);
767
+ t.amount = Be[u.value].toAdjustmentAmount(
768
+ r,
769
+ F.precision
770
+ ), o("update:modelValue", t);
771
+ }
772
+ }), w = U({
773
+ get() {
774
+ var r;
775
+ return ((r = i.modelValue.measurement) == null ? void 0 : r.id) ?? null;
776
+ },
777
+ set(r) {
778
+ var F, C;
779
+ const t = {
780
+ ...i.modelValue
781
+ };
782
+ t.measurement = ((C = (F = i.modelValue.doc.unit) == null ? void 0 : F.measurements) == null ? void 0 : C.find((k) => k.id === r)) ?? null, o("update:modelValue", t);
783
+ }
784
+ }), x = U({
785
+ get() {
786
+ return i.modelValue.remark ?? "";
787
+ },
788
+ set(r) {
789
+ const t = {
790
+ ...i.modelValue
791
+ };
792
+ t.remark = r, o("update:modelValue", t);
793
+ }
794
+ });
795
+ return (r, t) => {
796
+ const F = M("FmButton"), C = M("FmSelect"), k = M("FmTextarea"), a = M("FmCard");
797
+ return $(), K(a, {
798
+ variant: "outlined",
799
+ class: "grid grid-cols-2 gap-8 p-16"
800
+ }, {
801
+ default: j(() => [
802
+ n("div", cn, [
803
+ n("div", dn, h(r.modelValue.doc.name), 1),
804
+ g(F, {
805
+ variant: "tertiary",
806
+ "prepend-icon": "delete",
807
+ onClick: t[0] || (t[0] = (V) => o("click:delete"))
808
+ })
809
+ ]),
810
+ g(C, {
811
+ disabled: r.disabled,
812
+ class: "col-span-2",
813
+ label: "Type",
814
+ items: S.value,
815
+ modelValue: u.value,
816
+ "onUpdate:modelValue": t[1] || (t[1] = (V) => u.value = V),
817
+ rules: [l(ft)()],
818
+ "label-mark": "required"
819
+ }, null, 8, ["disabled", "items", "modelValue", "rules"]),
820
+ g(Ht, {
821
+ disabled: r.disabled,
822
+ label: "Amount",
823
+ step: +l(de)({
824
+ amount: 1,
825
+ precision: l(Me)(r.modelValue.doc.unit, r.modelValue.measurement)
826
+ }),
827
+ modelValue: m.value,
828
+ "onUpdate:modelValue": t[2] || (t[2] = (V) => m.value = V),
829
+ rules: [l(De)(0)]
830
+ }, null, 8, ["disabled", "step", "modelValue", "rules"]),
831
+ g(C, {
832
+ disabled: r.disabled,
833
+ label: "Unit",
834
+ items: _.value,
835
+ modelValue: w.value,
836
+ "onUpdate:modelValue": t[3] || (t[3] = (V) => w.value = V)
837
+ }, null, 8, ["disabled", "items", "modelValue"]),
838
+ g(k, {
839
+ class: "col-span-2",
840
+ disabled: r.disabled,
841
+ label: "Remark",
842
+ modelValue: x.value,
843
+ "onUpdate:modelValue": t[4] || (t[4] = (V) => x.value = V),
844
+ "label-mark": "optional"
845
+ }, null, 8, ["disabled", "modelValue"])
846
+ ]),
847
+ _: 1
848
+ });
849
+ };
850
+ }
851
+ }), pn = { class: "flex items-center" }, vn = { class: "fm-typo-en-title-md-800" }, fn = { class: "flex items-center" }, yn = { class: "fm-typo-en-title-sm-800 flex-1" }, _n = { class: "flex gap-8" }, kn = /* @__PURE__ */ ie({
852
+ __name: "AdjustSkuDialog",
853
+ props: {
854
+ stock: {},
855
+ show: { type: Boolean }
856
+ },
857
+ emits: ["update:show", "submitted"],
858
+ setup(f, { expose: y, emit: i }) {
859
+ const o = f, S = i, _ = Ue(), u = nt(), m = Ee(), w = ye(), x = O(!1), { t: r } = ue();
860
+ function t() {
861
+ a(Te(k));
862
+ }
863
+ const F = O();
864
+ y({
865
+ validateInputs: () => {
866
+ var B, A;
867
+ (A = (B = F.value) == null ? void 0 : B.validateInputs) == null || A.call(B);
868
+ },
869
+ resetInputsValidation: () => {
870
+ var B, A;
871
+ (A = (B = F.value) == null ? void 0 : B.resetInputsValidation) == null || A.call(B);
872
+ },
873
+ resetInputs: () => {
874
+ var B, A;
875
+ (A = (B = F.value) == null ? void 0 : B.resetInputs) == null || A.call(B);
876
+ }
877
+ });
878
+ const C = He(o, "show"), k = at({
879
+ remark: "",
880
+ adjustments: [
881
+ {
882
+ id: `sku_${(/* @__PURE__ */ new Date()).toISOString()}_${Math.random().toString(16).slice(2, 8)}`,
883
+ type: Z.enum.PURCHASE,
884
+ doc: o.stock,
885
+ measurement: null,
886
+ remark: "",
887
+ amount: fe(1)
888
+ }
889
+ ]
890
+ });
891
+ be([() => o.show], ([B]) => {
892
+ B && (k.remark = "", k.adjustments = [
893
+ {
894
+ id: `sku_${(/* @__PURE__ */ new Date()).toISOString()}_${Math.random().toString(16).slice(2, 8)}`,
895
+ type: Z.enum.PURCHASE,
896
+ doc: o.stock,
897
+ measurement: null,
898
+ remark: "",
899
+ amount: fe(1)
900
+ }
901
+ ]);
902
+ });
903
+ async function a(B) {
904
+ x.value = !0;
905
+ try {
906
+ await m.adjustSku({
907
+ remark: B.remark,
908
+ adjustments: B.adjustments.map(({ doc: A, remark: D, type: P, amount: E, measurement: te }) => ({
909
+ id: A._id,
910
+ amount: E,
911
+ measurement: te,
912
+ remark: D,
913
+ doc: A,
914
+ type: P
915
+ }))
916
+ }), S("update:show", !1), S("submitted");
917
+ } catch (A) {
918
+ w.open({
919
+ title: r("inventory.stock.adjust.error.title"),
920
+ message: r("inventory.stock.adjust.error.message"),
921
+ type: "error"
922
+ }), console.log("error on adjust ingredients", B, A);
923
+ } finally {
924
+ x.value = !1;
925
+ }
926
+ }
927
+ function V() {
928
+ const B = _.skus.map((D) => ({
929
+ label: D.name,
930
+ sublabel: D.code,
931
+ value: D._id
932
+ })), A = B.filter((D) => k.adjustments.find((P) => P.doc._id === D.value)).map((D) => D.value);
933
+ u.open({
934
+ title: "Select ingredients",
935
+ contentComponent: yt,
936
+ contentComponentProps: {
937
+ items: B,
938
+ modelValue: A
939
+ },
940
+ overlay: !0,
941
+ closeButton: !0,
942
+ dismissAway: !0,
943
+ primaryActions: {
944
+ text: "Confirm",
945
+ close: !0
946
+ },
947
+ secondaryActions: {
948
+ text: "Close",
949
+ close: !0,
950
+ variant: "tertiary"
951
+ }
952
+ }).onPrimary((D) => {
953
+ k.adjustments = D.map(
954
+ (P) => k.adjustments.find((E) => E.doc._id === P) ?? {
955
+ id: `sku_${(/* @__PURE__ */ new Date()).toISOString()}_${Math.random().toString(16).slice(2, 8)}`,
956
+ type: Z.enum.PURCHASE,
957
+ doc: _.skus.find((E) => E._id === P),
958
+ measurement: null,
959
+ remark: "",
960
+ amount: fe(1)
961
+ }
962
+ );
963
+ });
964
+ }
965
+ function L(B) {
966
+ k.adjustments.splice(B, 1);
967
+ }
968
+ return (B, A) => {
969
+ const D = M("FmTextarea"), P = M("FmButton"), E = M("FmForm"), te = M("FmSideSheet");
970
+ return $(), K(te, {
971
+ modelValue: l(C),
972
+ "onUpdate:modelValue": A[2] || (A[2] = (q) => Ie(C) ? C.value = q : null),
973
+ "dismiss-away": "",
974
+ "max-width": 500
975
+ }, {
976
+ "side-sheet-header": j(() => [
977
+ n("div", pn, [
978
+ n("div", vn, h(l(r)("inventory.stock.adjust.title")), 1)
979
+ ])
980
+ ]),
981
+ default: j(() => [
982
+ g(E, {
983
+ class: "w-full flex flex-col gap-12",
984
+ ref_key: "formRef",
985
+ ref: F,
986
+ onValidationSuccess: t
987
+ }, {
988
+ default: j(() => [
989
+ g(D, {
990
+ label: l(r)("inventory.stock.adjust.remark"),
991
+ modelValue: k.remark,
992
+ "onUpdate:modelValue": A[0] || (A[0] = (q) => k.remark = q)
993
+ }, null, 8, ["label", "modelValue"]),
994
+ n("div", fn, [
995
+ n("div", yn, h(l(r)("inventory.stock.adjust.adjustedItems")), 1),
996
+ g(P, {
997
+ "prepend-icon": "add",
998
+ variant: "tertiary",
999
+ size: "md",
1000
+ onClick: V
1001
+ })
1002
+ ]),
1003
+ ($(!0), H(ee, null, le(k.adjustments, (q, N) => ($(), K(mn, {
1004
+ key: q.id,
1005
+ modelValue: k.adjustments[N],
1006
+ "onUpdate:modelValue": (R) => k.adjustments[N] = R,
1007
+ "onClick:delete": (R) => L(N)
1008
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "onClick:delete"]))), 128))
1009
+ ]),
1010
+ _: 1
1011
+ }, 512)
1012
+ ]),
1013
+ "side-sheet-footer": j(() => [
1014
+ n("div", _n, [
1015
+ g(P, {
1016
+ label: l(r)("inventory.stock.adjust.adjustButton"),
1017
+ loading: x.value,
1018
+ onClick: A[1] || (A[1] = (q) => {
1019
+ var N, R;
1020
+ return (R = (N = F.value) == null ? void 0 : N.validateInputs) == null ? void 0 : R.call(N);
1021
+ })
1022
+ }, null, 8, ["label", "loading"])
1023
+ ])
1024
+ ]),
1025
+ _: 1
1026
+ }, 8, ["modelValue"]);
1027
+ };
1028
+ }
1029
+ }), hn = _t((f, y) => ({
1030
+ // TODO: remove once latest inventory backend has been push
1031
+ async findBillsByBusinessId(i, o, S) {
1032
+ const _ = `${f.businessesBackendUrl}/${i}/reports/find-many`, u = {
1033
+ // type: TYPE.bill,
1034
+ type: "bill",
1035
+ restaurantIds: o,
1036
+ ids: S
1037
+ };
1038
+ return await y.post(_, u);
1039
+ },
1040
+ async findBillsById(i) {
1041
+ const S = pe().currentLocationDBName, _ = `${f.inventoryBackendUrl}/${S}/bill/search`, u = {
1042
+ ids: i
1043
+ };
1044
+ return await y.post(_, u);
1045
+ }
1046
+ })), gn = { class: "p-16" }, bn = { class: "fm-typo-en-body-md-600 flex-grow" }, xn = { class: "flex-grow text-fm-color-typo-secondary" }, Sn = {
1047
+ key: 0,
1048
+ class: "my-5"
1049
+ }, Fn = { class: "text-neutral-400" }, wn = { class: "flex-grow" }, $n = { class: "flex gap-1" }, An = { class: "flex flex-col gap-1" }, Cn = {
1050
+ key: 1,
1051
+ class: "t-system text-fsecondary"
1052
+ }, Vn = {
1053
+ key: 2,
1054
+ class: "inline-flex items-center rounded-md bg-yellow-400/10 px-2 text-xs font-medium text-yellow-500 inset-ring inset-ring-yellow-400/20"
1055
+ }, Bn = {
1056
+ key: 0,
1057
+ class: "shrink-0 text-fm-color-typo-secondary"
1058
+ }, Mn = /* @__PURE__ */ ie({
1059
+ __name: "StockRecordCard",
1060
+ props: {
1061
+ record: {},
1062
+ sku: {},
1063
+ bills: { default: () => [] }
1064
+ },
1065
+ setup(f) {
1066
+ const y = f, i = O(!1), o = O(), S = O(null), _ = U(() => S.value === null ? "unset" : i.value ? `${S.value}px` : "0px");
1067
+ qe(() => {
1068
+ var x;
1069
+ S.value = ((x = o.value) == null ? void 0 : x.scrollHeight) || 0;
1070
+ });
1071
+ const u = U(() => {
1072
+ var k;
1073
+ const x = y.record.adjustments, r = y.sku, t = {}, C = x.flatMap((a) => {
1074
+ var V;
1075
+ return ((V = a.skus) == null ? void 0 : V.filter((L) => L.sku._id === r._id)) ?? [];
1076
+ }).flatMap((a) => a.amounts);
1077
+ for (const a of C) {
1078
+ const V = a.measurement ? kt(a.measurement.conversion, a.amount) : a.amount;
1079
+ t[k = a.type] ?? (t[k] = { amount: 0, precision: 0 }), t[a.type] = Xe(V, t[a.type]);
1080
+ }
1081
+ return Object.entries(t).reduce(
1082
+ (a, [V, L]) => (a[V] = /// comment, because without it formatter makes code uglier
1083
+ `${Y.toFormatString({
1084
+ value: L,
1085
+ precision: 4
1086
+ })} ${r.unit.abbrev}`, a),
1087
+ {}
1088
+ );
1089
+ }), { t: m } = ue(), w = U(() => y.record.adjustmentsByTime.map(({ date: x, adjustments: r }) => ({
1090
+ time: ht(new Date(x)),
1091
+ adjustments: r.flatMap(
1092
+ (t) => {
1093
+ var F, C;
1094
+ return ((C = (F = t.skus) == null ? void 0 : F.map) == null ? void 0 : C.call(F, (k) => {
1095
+ var a, V;
1096
+ return {
1097
+ ...k,
1098
+ ref: t.ref,
1099
+ backdateFrom: t.effectiveAt != null ? et(t._id) : null,
1100
+ toBalance: (V = (a = t.skus) == null ? void 0 : a[0]) == null ? void 0 : V.toBalance
1101
+ };
1102
+ })) ?? [];
1103
+ }
1104
+ ).flatMap((t) => {
1105
+ var k;
1106
+ const F = (k = y.bills.find((a) => a._id === t.ref)) == null ? void 0 : k.seqNumber, C = F ? m("inventory.stock.record.bill", [F]) : "";
1107
+ return t.amounts.map((a) => {
1108
+ var V;
1109
+ return {
1110
+ amount: `${Y.toFormatString({ value: a.amount, precision: 4 })} ${((V = a.measurement) == null ? void 0 : V.abbrev) ?? t.sku.unit.abbrev}`,
1111
+ backdateFrom: t.backdateFrom,
1112
+ name: a.type,
1113
+ remark: a.remark || C || "",
1114
+ cost: a.cost,
1115
+ toBalance: Y.toFormatString({
1116
+ value: t.toBalance ?? Y.fromNumber(0),
1117
+ precision: 4
1118
+ }),
1119
+ baseUnit: t.sku.unit.abbrev
1120
+ };
1121
+ });
1122
+ })
1123
+ })));
1124
+ return (x, r) => {
1125
+ const t = M("FmIcon"), F = M("FmTooltip"), C = M("FmCard");
1126
+ return $(), K(C, { variant: "outlined" }, {
1127
+ default: j(() => [
1128
+ n("div", gn, [
1129
+ n("div", {
1130
+ class: "flex items-center cursor-pointer mb-1",
1131
+ onClick: r[0] || (r[0] = (k) => i.value = !i.value)
1132
+ }, [
1133
+ n("div", bn, h(x.record.date), 1),
1134
+ g(t, {
1135
+ name: i.value ? "expand_more" : "expand_less",
1136
+ color: "#777777",
1137
+ size: "md"
1138
+ }, null, 8, ["name"])
1139
+ ]),
1140
+ ($(!0), H(ee, null, le(u.value, (k, a) => ($(), H("div", {
1141
+ key: a,
1142
+ class: "flex flex-row py-1",
1143
+ style: { "font-size": "0.8rem" }
1144
+ }, [
1145
+ n("div", xn, h(l(m)(`inventory.inventoryAdjustment.type.${a}`)), 1),
1146
+ n("div", {
1147
+ class: ge({
1148
+ "text-fm-color-typo-error": k.startsWith("-"),
1149
+ "text-fm-color-typo-success": !k.startsWith("-"),
1150
+ "ml-auto": !0
1151
+ })
1152
+ }, h(k), 3)
1153
+ ]))), 128)),
1154
+ n("div", {
1155
+ ref_key: "detailRef",
1156
+ ref: o,
1157
+ style: Qe({
1158
+ fontSize: "0.8rem",
1159
+ maxHeight: _.value,
1160
+ overflow: "hidden",
1161
+ transition: "max-height 0.2s ease-out"
1162
+ })
1163
+ }, [
1164
+ w.value.length ? ($(), H("hr", Sn)) : J("", !0),
1165
+ ($(!0), H(ee, null, le(w.value, (k) => ($(), H("div", {
1166
+ key: k.time,
1167
+ class: "flex gap-1 w-full"
1168
+ }, [
1169
+ n("div", Fn, h(k.time), 1),
1170
+ n("div", wn, [
1171
+ ($(!0), H(ee, null, le(k.adjustments, (a) => ($(), H("div", {
1172
+ key: a.name,
1173
+ class: "flex gap-1"
1174
+ }, [
1175
+ n("div", $n, [
1176
+ ce(h(l(m)(`inventory.inventoryAdjustment.type.${a.name}`)) + " ", 1),
1177
+ a.backdateFrom ? ($(), K(F, {
1178
+ key: 0,
1179
+ variant: "plain",
1180
+ placement: "top",
1181
+ "z-index": 50
1182
+ }, {
1183
+ content: j(() => [
1184
+ n("div", An, h(l(m)("inventory.stock.record.backdate", [
1185
+ l(Je)(new Date(a.backdateFrom))
1186
+ ])), 1)
1187
+ ]),
1188
+ default: j(() => [
1189
+ g(t, {
1190
+ name: "info",
1191
+ size: "sm",
1192
+ color: "primary"
1193
+ })
1194
+ ]),
1195
+ _: 2
1196
+ }, 1024)) : J("", !0),
1197
+ a.remark ? ($(), H("span", Cn, " # " + h(a.remark), 1)) : J("", !0),
1198
+ a.name === l(Z).Enum.CLOSING ? ($(), H("span", Vn, " Actual Balance: " + h(a.toBalance) + " " + h(a.baseUnit), 1)) : J("", !0)
1199
+ ]),
1200
+ n("div", {
1201
+ class: ge({
1202
+ "text-fm-color-typo-error": a.amount.startsWith("-"),
1203
+ "text-fm-color-typo-success": !a.amount.startsWith("-"),
1204
+ "ml-auto": !0
1205
+ })
1206
+ }, h(a.amount), 3),
1207
+ a.cost ? ($(), H("div", Bn, " (" + h(l(ke)(a.cost, !1, a.cost.precision)) + ") ", 1)) : J("", !0)
1208
+ ]))), 128))
1209
+ ])
1210
+ ]))), 128))
1211
+ ], 4)
1212
+ ])
1213
+ ]),
1214
+ _: 1
1215
+ });
1216
+ };
1217
+ }
1218
+ });
1219
+ function Dn(f, y) {
1220
+ var _;
1221
+ const i = Object.keys(Z.enum).reduce(
1222
+ (u, m) => (u[m] = { amount: 0, precision: 0 }, u),
1223
+ {}
1224
+ );
1225
+ if (!y)
1226
+ return Object.entries(i).reduce(
1227
+ (u, [m]) => (u[m] = Y.fromNumber(0), u),
1228
+ {}
1229
+ );
1230
+ const S = f.flatMap((u) => {
1231
+ var m;
1232
+ return ((m = u.skus) == null ? void 0 : m.filter((w) => w.sku._id === y._id)) ?? [];
1233
+ }).flatMap((u) => u.amounts);
1234
+ for (const u of S) {
1235
+ const m = u.measurement ? Y.multiply([u.measurement.conversion, u.amount]) : u.amount;
1236
+ i[_ = u.type] ?? (i[_] = { amount: 0, precision: 0 }), i[u.type] = Y.add([m, i[u.type]]);
1237
+ }
1238
+ return Object.entries(i).reduce(
1239
+ (u, [m, w]) => {
1240
+ const x = {
1241
+ ...w,
1242
+ amount: Math.abs(w.amount)
1243
+ };
1244
+ return u[m] = /// comment, because without it formatter makes code uglier
1245
+ `${Y.toFormatString({
1246
+ value: x,
1247
+ precision: 4
1248
+ })} ${y.unit.abbrev}`, u;
1249
+ },
1250
+ {}
1251
+ );
1252
+ }
1253
+ function jn(f, y) {
1254
+ if (!y)
1255
+ return null;
1256
+ let i = null;
1257
+ const S = f.flatMap((_) => {
1258
+ var u;
1259
+ return ((u = _.skus) == null ? void 0 : u.filter((m) => m.sku._id === y._id)) ?? [];
1260
+ }).flatMap((_) => {
1261
+ var u;
1262
+ return !_.history || ((u = _.history) == null ? void 0 : u.length) === 0 ? [] : _.history[0];
1263
+ });
1264
+ for (const _ of S) {
1265
+ const u = _.amounts;
1266
+ for (const m of u) {
1267
+ if (m.type !== Z.Enum.SALES)
1268
+ continue;
1269
+ const w = m.measurement ? Y.multiply([m.measurement.conversion, m.amount]) : m.amount;
1270
+ i ?? (i = Y.fromNumber(0)), i = Y.add([i, w]);
1271
+ }
1272
+ }
1273
+ return i != null ? (i.amount = Math.abs(i.amount), `${Y.toFormatString({
1274
+ value: i,
1275
+ precision: 4
1276
+ })} ${y.unit.abbrev}`) : null;
1277
+ }
1278
+ const In = { class: "flex items-center w-full fm-typo-en-title-md-800" }, Tn = { class: "flex-1 line-clamp-2" }, Un = { class: "flex flex-col gap-32 w-full h-full" }, Pn = { class: "flex items-center relative gap-4" }, En = { class: "flex-1" }, Hn = {
1279
+ key: 0,
1280
+ class: "flex-1 flex flex-col items-center gap-16"
1281
+ }, Rn = { class: "fm-typo-en-body-lg-400 translate-x-4" }, On = {
1282
+ key: 1,
1283
+ class: "flex flex-col gap-12"
1284
+ }, Ln = { class: "pb-16" }, Nn = { class: "fm-typo-cn-body-lg-600" }, zn = {
1285
+ class: "grid gap-12 fm-typo-en-body-md-400",
1286
+ style: { "grid-template-columns": "auto auto auto", "grid-auto-rows": "1fr" }
1287
+ }, Yn = { class: "flex flex-col gap-1" }, Kn = { class: "text-fm-color-typo-secondary" }, Gn = { class: "font-bold" }, Wn = { class: "flex flex-col gap-1" }, qn = { class: "text-fm-color-typo-secondary flex" }, Qn = { class: "font-bold" }, Xn = { class: "flex flex-col gap-1" }, Jn = { class: "text-fm-color-typo-secondary" }, Zn = { class: "font-bold" }, eo = { class: "flex flex-col gap-1" }, to = { class: "text-fm-color-typo-secondary" }, no = { class: "font-bold" }, oo = { class: "flex flex-col gap-1" }, so = { class: "text-fm-color-typo-secondary" }, ao = { class: "font-bold" }, ro = { class: "flex flex-col gap-1" }, lo = { class: "text-fm-color-typo-secondary" }, io = { class: "font-bold" }, uo = { class: "flex flex-col gap-1" }, co = { class: "text-fm-color-typo-secondary" }, mo = { class: "font-bold" }, po = { class: "flex flex-col gap-1" }, vo = { class: "text-fm-color-typo-secondary" }, fo = { class: "font-bold" }, yo = { class: "flex flex-col gap-1" }, _o = { class: "text-fm-color-typo-secondary" }, ko = { class: "font-bold" }, ho = {
1288
+ key: 0,
1289
+ class: "flex flex-col gap-8"
1290
+ }, go = { class: "flex" }, bo = { class: "flex-1 flex flex-col gap-1" }, xo = { class: "flex gap-1 items-center text-fm-color-typo-secondary" }, So = { class: "font-bold" }, Fo = { class: "flex-1 flex flex-col gap-1" }, wo = { class: "flex gap-1 items-center text-fm-color-typo-secondary" }, $o = { class: "flex flex-col gap-1" }, Ao = { class: "font-bold" }, Co = {
1291
+ key: 2,
1292
+ class: "flex-1 flex flex-col items-center gap-8"
1293
+ }, Vo = ["src"], Bo = { class: "font-bold text-lg" }, Mo = { class: "text-xs text-neutral-400 text-center" }, Do = /* @__PURE__ */ ie({
1294
+ __name: "StockHistory",
1295
+ props: {
1296
+ sku: {},
1297
+ show: { type: Boolean }
1298
+ },
1299
+ emits: ["update:show"],
1300
+ setup(f) {
1301
+ const y = Tt(), i = Pe(), o = Ee(), S = hn(), _ = pe(), u = St(), { t: m } = ue(), w = f, x = O(!1), r = ye(), t = O(gt(0));
1302
+ async function F() {
1303
+ x.value = !0;
1304
+ try {
1305
+ await B(), await i.readStockBalance();
1306
+ } catch (e) {
1307
+ r.open({
1308
+ title: "Something went wrong",
1309
+ message: "Cannot fetch stock history. Please try again.",
1310
+ type: "error"
1311
+ }), console.log("failed at fetching item adjustment history", w.sku, t, e);
1312
+ } finally {
1313
+ x.value = !1;
1314
+ }
1315
+ }
1316
+ qe(() => {
1317
+ F();
1318
+ }), be([() => t.value, () => w.sku], () => {
1319
+ F();
1320
+ });
1321
+ const C = O([]), k = O([]), a = O(new Array());
1322
+ function V(e, s) {
1323
+ return s === "day" ? Ct(e) : Je(e);
1324
+ }
1325
+ function L(e, s) {
1326
+ const v = e.reduce(
1327
+ (c, d) => {
1328
+ const b = d.effectiveAt ?? et(d._id);
1329
+ if (!b)
1330
+ return c;
1331
+ const I = V(new Date(b), s);
1332
+ return c[I] ?? (c[I] = []), c[I].push(d), c;
1333
+ },
1334
+ {}
1335
+ );
1336
+ return Object.keys(v).map((c) => ({
1337
+ date: c,
1338
+ adjustments: v[c]
1339
+ }));
1340
+ }
1341
+ async function B() {
1342
+ let e = await o.readStockAdjustment(
1343
+ w.sku._id,
1344
+ Ft(new Date(t.value.startDate)).toISOString(),
1345
+ wt(new Date(t.value.endDate)).toISOString()
1346
+ );
1347
+ C.value = e;
1348
+ const s = e.filter(({ ref: v }) => v == null ? void 0 : v.startsWith("bill_")).map(({ ref: v }) => v);
1349
+ await A(s), k.value = L(e, "day").map(({ date: v, adjustments: c }) => ({
1350
+ date: v,
1351
+ adjustments: c,
1352
+ adjustmentsByTime: L(c, "minute")
1353
+ }));
1354
+ }
1355
+ async function A(e) {
1356
+ e.length && (a.value = await S.findBillsById(e).catch((s) => {
1357
+ var d;
1358
+ console.error("Error on using latest bill API, retrying using legacy api", s);
1359
+ const v = ((d = y.currentBusiness.value) == null ? void 0 : d._id) ?? "", c = _.currentLocation.doc._id;
1360
+ return S.findBillsByBusinessId(v, [c], e);
1361
+ }));
1362
+ }
1363
+ const D = U(() => {
1364
+ const e = C.value, s = w.sku;
1365
+ return Dn(e, s);
1366
+ }), P = U(() => {
1367
+ const e = C.value, s = w.sku;
1368
+ return jn(e, s);
1369
+ }), E = U(() => {
1370
+ const e = [...C.value].computeFirst((v) => {
1371
+ var d, b;
1372
+ const c = (b = (d = v.skus) == null ? void 0 : d.find) == null ? void 0 : b.call(d, (I) => I.sku._id === w.sku._id);
1373
+ return c == null ? void 0 : c.fromBalance;
1374
+ }) ?? {
1375
+ amount: 0,
1376
+ precision: 0
1377
+ }, s = w.sku;
1378
+ return s ? `${Y.toFormatString({
1379
+ value: e,
1380
+ precision: 4
1381
+ })} ${s.unit.abbrev}` : "";
1382
+ }), te = U(() => {
1383
+ const e = [...C.value].reverse().computeFirst((v) => {
1384
+ var d, b;
1385
+ const c = (b = (d = v.skus) == null ? void 0 : d.find) == null ? void 0 : b.call(d, (I) => I.sku._id === w.sku._id);
1386
+ return c == null ? void 0 : c.toBalance;
1387
+ }) ?? {
1388
+ amount: 0,
1389
+ precision: 0
1390
+ }, s = w.sku;
1391
+ return s ? `${Y.toFormatString({ value: e, precision: 4 })} ${s.unit.abbrev}` : "";
1392
+ }), q = U(() => {
1393
+ var v;
1394
+ const s = C.value.flatMap((c) => {
1395
+ var d;
1396
+ return ((d = c.skus) == null ? void 0 : d.flatMap((b) => b.amounts)) ?? [];
1397
+ }).filter((c) => c.amount.amount < 0).reduce(
1398
+ (c, d) => {
1399
+ const b = d.cost;
1400
+ if (!b) return c;
1401
+ const I = {
1402
+ ...bt(c, Math.max(c.precision, b.precision)),
1403
+ currency: b.currency
1404
+ };
1405
+ return {
1406
+ ...Xe(I, b),
1407
+ currency: c.currency
1408
+ };
1409
+ },
1410
+ {
1411
+ amount: 0,
1412
+ precision: 0,
1413
+ currency: Ae((v = y.currentCountry) == null ? void 0 : v.value)
1414
+ }
1415
+ );
1416
+ return ke(s, !1, s.precision);
1417
+ });
1418
+ function N() {
1419
+ const { startDate: e, endDate: s } = $t(t.value);
1420
+ e !== null && s !== null && (t.value = {
1421
+ startDate: e,
1422
+ endDate: s
1423
+ });
1424
+ }
1425
+ const R = U(() => w.sku.valuation === ze.Enum.FIFO ? m("inventory.ingredient.valuationMethod.FIFO") : m("inventory.ingredient.valuationMethod.WAVG")), G = U(() => {
1426
+ var I, Q, oe, T;
1427
+ const e = [...C.value].reverse().computeFirst((z) => {
1428
+ var W, se;
1429
+ return (se = (W = z.skus) == null ? void 0 : W.find) == null ? void 0 : se.call(W, (re) => re.sku._id === w.sku._id);
1430
+ });
1431
+ if (!e) return "No data";
1432
+ const s = [...e.amounts].reverse()[0], v = {
1433
+ amount: ((I = s.cost) == null ? void 0 : I.amount) ?? 0,
1434
+ precision: ((Q = s.cost) == null ? void 0 : Q.precision) ?? 0
1435
+ }, c = s.amount, d = c.amount == 0 ? Y.fromNumber(0) : Y.divide([v, c]);
1436
+ return {
1437
+ ...Y.multiply([d, c]),
1438
+ currency: ((oe = s.cost) == null ? void 0 : oe.currency) || Ae(((T = y.currentCountry) == null ? void 0 : T.value) ?? xt)
1439
+ };
1440
+ }), ae = U(() => {
1441
+ var v;
1442
+ const e = [...C.value].reverse().computeFirst((c) => {
1443
+ var b, I;
1444
+ const d = (I = (b = c.skus) == null ? void 0 : b.find) == null ? void 0 : I.call(b, (Q) => Q.sku._id === w.sku._id);
1445
+ return d == null ? void 0 : d.toCostBalances;
1446
+ });
1447
+ return e ? {
1448
+ ...e.reduce((c, d) => Y.add([c, Y.fromDinero(d.cost)]), {
1449
+ amount: 0,
1450
+ precision: 0
1451
+ }),
1452
+ currency: Ae((v = y.currentCountry) == null ? void 0 : v.value)
1453
+ } : "No data";
1454
+ });
1455
+ function me() {
1456
+ const { startDate: e, endDate: s } = At(t.value);
1457
+ e !== null && s !== null && (t.value = {
1458
+ startDate: e,
1459
+ endDate: s
1460
+ });
1461
+ }
1462
+ const p = He(w, "show");
1463
+ return (e, s) => {
1464
+ const v = M("FmButton"), c = M("FmField"), d = M("FmDateRangePicker"), b = M("FmSpacer"), I = M("FmCircularProgress"), Q = M("FmIcon"), oe = M("FmTooltip"), T = M("FmMenuDivider"), z = M("FmChip"), W = M("FmCardSection"), se = M("FmCard"), re = M("FmSideSheet");
1465
+ return $(), K(re, {
1466
+ "dismiss-away": "",
1467
+ modelValue: l(p),
1468
+ "onUpdate:modelValue": s[4] || (s[4] = (X) => Ie(p) ? p.value = X : null),
1469
+ "close-button": !1,
1470
+ "max-width": 560
1471
+ }, {
1472
+ "side-sheet-header": j(() => [
1473
+ n("div", In, [
1474
+ n("div", Tn, h(l(m)("inventory.stock.history.title", [e.sku.name])), 1),
1475
+ g(v, {
1476
+ variant: "tertiary",
1477
+ "prepend-icon": "close",
1478
+ onClick: s[0] || (s[0] = (X) => p.value = !1)
1479
+ })
1480
+ ])
1481
+ ]),
1482
+ default: j(() => {
1483
+ var X;
1484
+ return [
1485
+ n("div", Un, [
1486
+ n("div", Pn, [
1487
+ n("div", En, [
1488
+ g(d, {
1489
+ modelValue: t.value,
1490
+ "onUpdate:modelValue": s[1] || (s[1] = (ne) => t.value = ne),
1491
+ "show-predefined-range": "",
1492
+ "start-label": "",
1493
+ "end-label": "",
1494
+ "z-index": 50
1495
+ }, {
1496
+ "trigger-button": j(({ opened: ne }) => [
1497
+ g(c, {
1498
+ "prepend-icon": "calendar_month",
1499
+ focused: ne
1500
+ }, {
1501
+ default: j(() => [
1502
+ ce(h(t.value.startDate) + " - " + h(t.value.endDate), 1)
1503
+ ]),
1504
+ _: 2
1505
+ }, 1032, ["focused"])
1506
+ ]),
1507
+ _: 1
1508
+ }, 8, ["modelValue"])
1509
+ ]),
1510
+ g(v, {
1511
+ variant: "tertiary",
1512
+ onClick: s[2] || (s[2] = (ne) => N()),
1513
+ "prepend-icon": "navigate_before"
1514
+ }),
1515
+ g(v, {
1516
+ variant: "tertiary",
1517
+ onClick: s[3] || (s[3] = (ne) => me()),
1518
+ "prepend-icon": "navigate_next"
1519
+ })
1520
+ ]),
1521
+ x.value ? ($(), H("div", Hn, [
1522
+ g(b),
1523
+ g(I, { size: "xl" }),
1524
+ n("div", Rn, h(l(m)("inventory.stock.history.loading")), 1),
1525
+ g(b),
1526
+ g(b)
1527
+ ])) : k.value && ((X = k.value) == null ? void 0 : X.length) > 0 ? ($(), H("div", On, [
1528
+ g(se, { variant: "outlined" }, {
1529
+ default: j(() => [
1530
+ g(W, { class: "flex flex-col gap-4" }, {
1531
+ default: j(() => [
1532
+ n("div", Ln, [
1533
+ n("div", Nn, h(l(m)("inventory.stock.history.summary.title")), 1)
1534
+ ]),
1535
+ n("div", zn, [
1536
+ n("div", Yn, [
1537
+ n("div", Kn, h(l(m)("inventory.stock.history.summary.totalPurchase")), 1),
1538
+ n("div", Gn, h(D.value.PURCHASE), 1)
1539
+ ]),
1540
+ n("div", Wn, [
1541
+ n("div", qn, [
1542
+ ce(h(l(m)("inventory.stock.history.summary.totalSales")) + "  ", 1),
1543
+ P.value != null ? ($(), K(oe, {
1544
+ key: 0,
1545
+ variant: "plain",
1546
+ placement: "top",
1547
+ content: `Before: ${P.value}`,
1548
+ "z-index": 50
1549
+ }, {
1550
+ default: j(() => [
1551
+ g(Q, {
1552
+ name: "warning",
1553
+ size: "sm"
1554
+ })
1555
+ ]),
1556
+ _: 1
1557
+ }, 8, ["content"])) : J("", !0)
1558
+ ]),
1559
+ n("div", Qn, h(D.value.SALES), 1)
1560
+ ]),
1561
+ n("div", Xn, [
1562
+ n("div", Jn, h(l(m)("inventory.stock.history.summary.totalLose")), 1),
1563
+ n("div", Zn, h(D.value.LOSE), 1)
1564
+ ]),
1565
+ n("div", eo, [
1566
+ n("div", to, h(l(m)("inventory.stock.history.summary.totalRequest")), 1),
1567
+ n("div", no, h(D.value.REQUEST), 1)
1568
+ ]),
1569
+ n("div", oo, [
1570
+ n("div", so, h(l(m)("inventory.stock.history.summary.totalReceive")), 1),
1571
+ n("div", ao, h(D.value.RECEIVE), 1)
1572
+ ]),
1573
+ n("div", ro, [
1574
+ n("div", lo, h(l(m)("inventory.stock.history.summary.totalConvert")), 1),
1575
+ n("div", io, h(D.value.CONVERT), 1)
1576
+ ]),
1577
+ n("div", uo, [
1578
+ n("div", co, h(l(m)("inventory.stock.history.summary.totalDamage")), 1),
1579
+ n("div", mo, h(D.value.DAMAGE), 1)
1580
+ ]),
1581
+ n("div", po, [
1582
+ n("div", vo, h(l(m)("inventory.stock.history.summary.openingBalance")), 1),
1583
+ n("div", fo, h(E.value), 1)
1584
+ ]),
1585
+ n("div", yo, [
1586
+ n("div", _o, h(l(m)("inventory.stock.history.summary.lastStockBalance")), 1),
1587
+ n("div", ko, h(te.value), 1)
1588
+ ])
1589
+ ]),
1590
+ l(u).enableTotalCost ? ($(), H("div", ho, [
1591
+ g(T, { class: "w-full" }),
1592
+ n("div", go, [
1593
+ n("div", bo, [
1594
+ g(Ke, { "z-index": 50 }, {
1595
+ default: j(() => [
1596
+ n("div", xo, [
1597
+ ce(h(l(m)("inventory.stock.history.estimatedValue")) + " ", 1),
1598
+ g(oe, {
1599
+ variant: "plain",
1600
+ placement: "top",
1601
+ content: `[${R.value}] ${l(m)("inventory.stock.history.estimatedValueTooltip")}`,
1602
+ "z-index": 50
1603
+ }, {
1604
+ default: j(() => [
1605
+ g(Q, {
1606
+ name: "help",
1607
+ size: "sm"
1608
+ })
1609
+ ]),
1610
+ _: 1
1611
+ }, 8, ["content"])
1612
+ ])
1613
+ ]),
1614
+ _: 1
1615
+ }),
1616
+ n("div", So, [
1617
+ e.sku.valuation === l(ze).Enum.FIFO ? ($(), H(ee, { key: 0 }, [
1618
+ g(z, {
1619
+ label: "FIFO",
1620
+ compact: ""
1621
+ }),
1622
+ ce(" " + h(typeof ae.value != "string" ? l(ke)(
1623
+ ae.value,
1624
+ !1,
1625
+ ae.value.precision
1626
+ ) : ae.value), 1)
1627
+ ], 64)) : ($(), H(ee, { key: 1 }, [
1628
+ ce(h(typeof G.value != "string" ? l(ke)(
1629
+ G.value,
1630
+ !1,
1631
+ G.value.precision
1632
+ ) : G.value), 1)
1633
+ ], 64))
1634
+ ])
1635
+ ]),
1636
+ n("div", Fo, [
1637
+ g(Ke, { "z-index": 50 }, {
1638
+ default: j(() => [
1639
+ n("div", wo, [
1640
+ ce(h(l(m)("inventory.stock.history.costSold")) + " ", 1),
1641
+ g(oe, {
1642
+ variant: "plain",
1643
+ placement: "top",
1644
+ "z-index": 50
1645
+ }, {
1646
+ content: j(() => [
1647
+ n("div", $o, h(l(m)("inventory.stock.history.costSoldTooltip")), 1)
1648
+ ]),
1649
+ default: j(() => [
1650
+ g(Q, {
1651
+ name: "help",
1652
+ size: "sm"
1653
+ })
1654
+ ]),
1655
+ _: 1
1656
+ })
1657
+ ])
1658
+ ]),
1659
+ _: 1
1660
+ }),
1661
+ n("div", Ao, h(q.value), 1)
1662
+ ])
1663
+ ])
1664
+ ])) : J("", !0)
1665
+ ]),
1666
+ _: 1
1667
+ })
1668
+ ]),
1669
+ _: 1
1670
+ }),
1671
+ s[5] || (s[5] = n("div", null, null, -1)),
1672
+ ($(!0), H(ee, null, le(k.value, (ne) => ($(), H(ee, {
1673
+ key: ne.date
1674
+ }, [
1675
+ e.sku ? ($(), K(Mn, {
1676
+ key: 0,
1677
+ record: ne,
1678
+ sku: e.sku,
1679
+ bills: a.value
1680
+ }, null, 8, ["record", "sku", "bills"])) : J("", !0)
1681
+ ], 64))), 128))
1682
+ ])) : ($(), H("div", Co, [
1683
+ g(b),
1684
+ n("div", null, [
1685
+ n("img", {
1686
+ src: l(Rt),
1687
+ alt: "List is empty"
1688
+ }, null, 8, Vo)
1689
+ ]),
1690
+ n("div", Bo, h(l(m)("inventory.stock.history.noRecords")), 1),
1691
+ n("div", Mo, h(l(m)("inventory.stock.history.changeDateRange")), 1),
1692
+ g(b),
1693
+ g(b)
1694
+ ]))
1695
+ ])
1696
+ ];
1697
+ }),
1698
+ _: 1
1699
+ }, 8, ["modelValue"]);
1700
+ };
1701
+ }
1702
+ }), jo = { class: "flex flex-col gap-8" }, Io = { class: "flex flex-col" }, To = { class: "fm-typo-en-body-md-400 text-fm-color-typo-secondary" }, Uo = { class: "fm-typo-en-body-lg-600 text-fm-color-typo-primary line-clamp-1" }, Xo = /* @__PURE__ */ ie({
1703
+ __name: "StockView",
1704
+ setup(f) {
1705
+ const { t: y } = ue(), i = Ue(), o = pe(), S = Pe(), _ = st(), u = Ze(), { columnDefs: m } = Gt();
1706
+ o.watchLocation(r);
1707
+ const w = O(!1), x = ye();
1708
+ async function r() {
1709
+ if (o._currentLocation) {
1710
+ w.value = !0;
1711
+ try {
1712
+ await S.readStockBalance(), await S.readProductBalance(), await u.readStockEstimateBalance();
1713
+ } catch (A) {
1714
+ x.open({
1715
+ title: y("inventory.stock.error.title"),
1716
+ message: y("inventory.stock.error.message"),
1717
+ type: "error"
1718
+ }), console.error("error on fetch stock balance", A);
1719
+ } finally {
1720
+ w.value = !1;
1721
+ }
1722
+ }
1723
+ }
1724
+ const t = U(
1725
+ () => i.skus.map((A) => {
1726
+ var q, N, R;
1727
+ const D = A.trackingMeasurement;
1728
+ let P = (N = (q = S.stockBalance.skus) == null ? void 0 : q.find(
1729
+ (G) => G.id === A._id
1730
+ )) == null ? void 0 : N.balance, E = u.inventoryForecast.skus.find(
1731
+ (G) => G.id === A._id
1732
+ );
1733
+ return {
1734
+ ...A,
1735
+ balance: P ?? {
1736
+ amount: 0,
1737
+ precision: 0
1738
+ },
1739
+ day: (E == null ? void 0 : E.depletionDays) ?? void 0,
1740
+ trackingUnitAbbrev: D ? ((R = A.unit.measurements.find((G) => G.id === D)) == null ? void 0 : R.abbrev) ?? "" : A.unit.abbrev
1741
+ };
1742
+ })
1743
+ ), F = O(""), { breakpoints: C } = Ut(), k = U(() => C.value.xs || C.value.sm), a = U(() => k.value ? 10 : 20), V = Vt(), L = U(() => [
1744
+ {
1745
+ label: y("inventory.common.refresh"),
1746
+ value: "refresh"
1747
+ },
1748
+ {
1749
+ label: y("inventory.common.export"),
1750
+ value: "export"
1751
+ }
1752
+ ]);
1753
+ function B(A) {
1754
+ switch (A) {
1755
+ case "refresh":
1756
+ return r();
1757
+ case "export":
1758
+ return Nt(t.value);
1759
+ }
1760
+ }
1761
+ return (A, D) => {
1762
+ const P = M("FmTable");
1763
+ return $(), K(Bt, {
1764
+ title: l(y)("inventory.stock.title"),
1765
+ actions: L.value,
1766
+ "onClick:action": B
1767
+ }, {
1768
+ default: j(() => {
1769
+ var E, te, q, N;
1770
+ return [
1771
+ n("div", {
1772
+ class: ge([
1773
+ "flex flex-col gap-8 max-h-full",
1774
+ {
1775
+ "p-0": k.value,
1776
+ "px-24 ": !k.value
1777
+ }
1778
+ ])
1779
+ }, [
1780
+ g(Mt, {
1781
+ searchable: "",
1782
+ "change-location": "",
1783
+ search: F.value,
1784
+ "onUpdate:search": D[0] || (D[0] = (R) => F.value = R)
1785
+ }, null, 8, ["search"]),
1786
+ ($(), K(P, {
1787
+ style: Qe(l(V).tableHeight),
1788
+ "column-defs": l(m),
1789
+ "row-data": t.value,
1790
+ "search-value": F.value,
1791
+ loading: w.value || !l(o)._currentLocation,
1792
+ key: (E = l(o)._currentLocation) == null ? void 0 : E.dbName,
1793
+ onRowClick: D[1] || (D[1] = (R) => l(_).showSkuHistory(R.original)),
1794
+ "page-size": a.value
1795
+ }, {
1796
+ "list-row": j((R) => [
1797
+ g(Dt, {
1798
+ row: R,
1799
+ onRowClick: l(_).showSkuHistory
1800
+ }, {
1801
+ default: j((G) => {
1802
+ var ae, me, p, e, s, v, c, d, b, I;
1803
+ return [
1804
+ n("div", jo, [
1805
+ n("div", Io, [
1806
+ n("div", To, [
1807
+ g(l(Ye), {
1808
+ render: (p = (me = (ae = G.code) == null ? void 0 : ae.column) == null ? void 0 : me.columnDef) == null ? void 0 : p.cell,
1809
+ props: (s = (e = G.code) == null ? void 0 : e.getContext) == null ? void 0 : s.call(e)
1810
+ }, null, 8, ["render", "props"])
1811
+ ]),
1812
+ n("div", Uo, [
1813
+ g(l(Ye), {
1814
+ render: (d = (c = (v = G.name) == null ? void 0 : v.column) == null ? void 0 : c.columnDef) == null ? void 0 : d.cell,
1815
+ props: (I = (b = G.name) == null ? void 0 : b.getContext) == null ? void 0 : I.call(b)
1816
+ }, null, 8, ["render", "props"])
1817
+ ])
1818
+ ]),
1819
+ n("div", null, [
1820
+ g(je, {
1821
+ days: R.original.day
1822
+ }, null, 8, ["days"])
1823
+ ]),
1824
+ n("div", null, [
1825
+ g(ot, {
1826
+ class: "xs:w-[160px]",
1827
+ unit: R.original.unit,
1828
+ sku: R.original,
1829
+ amount: R.original.balance,
1830
+ "default-tracking-measurement": R.original.trackingMeasurement ?? void 0
1831
+ }, null, 8, ["unit", "sku", "amount", "default-tracking-measurement"])
1832
+ ])
1833
+ ])
1834
+ ];
1835
+ }),
1836
+ _: 2
1837
+ }, 1032, ["row", "onRowClick"])
1838
+ ]),
1839
+ _: 1
1840
+ }, 8, ["style", "column-defs", "row-data", "search-value", "loading", "page-size"]))
1841
+ ], 2),
1842
+ ($(), K(rt, { to: "body" }, [
1843
+ (te = l(_).stockHistoryProps) != null && te.sku ? ($(), K(Do, we($e({ key: 0 }, l(_).stockHistoryProps)), null, 16)) : J("", !0),
1844
+ (q = l(_).convertSkuDialogProps) != null && q.sku ? ($(), K(un, we($e({ key: 1 }, l(_).convertSkuDialogProps)), null, 16)) : J("", !0),
1845
+ (N = l(_).adjustSkuDialogProps) != null && N.stock ? ($(), K(kn, we($e({ key: 2 }, l(_).adjustSkuDialogProps)), null, 16)) : J("", !0)
1846
+ ]))
1847
+ ];
1848
+ }),
1849
+ _: 1
1850
+ }, 8, ["title", "actions"]);
1851
+ };
1852
+ }
1853
+ });
1854
+ export {
1855
+ Xo as default
1856
+ };