@fctc/interface-logic 4.3.9 → 4.4.1

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.
package/dist/hooks.mjs CHANGED
@@ -53,6 +53,58 @@ var UriConstants = /* @__PURE__ */ ((UriConstants2) => {
53
53
  // src/utils/format.ts
54
54
  import moment from "moment";
55
55
 
56
+ // src/constants/model/model-constant.ts
57
+ var LoadDataModel = /* @__PURE__ */ ((LoadDataModel2) => {
58
+ LoadDataModel2["ACCOUNT_CASH_ROUNDING"] = "account.cash.rounding";
59
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION"] = "account.fiscal.position";
60
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION_TAX"] = "account.fiscal.position.tax";
61
+ LoadDataModel2["ACCOUNT_TAX"] = "account.tax";
62
+ LoadDataModel2["ACCOUNT_TAX_GROUP"] = "account.tax.group";
63
+ LoadDataModel2["DECIMAL_PRECISION"] = "decimal.precision";
64
+ LoadDataModel2["IR_MODULE_MODULE"] = "ir.module.module";
65
+ LoadDataModel2["IR_UI_VIEW"] = "ir.ui.view";
66
+ LoadDataModel2["POS_BILL"] = "pos.bill";
67
+ LoadDataModel2["POS_CATEGORY"] = "pos.category";
68
+ LoadDataModel2["POS_CONFIG"] = "pos.config";
69
+ LoadDataModel2["POS_NOTE"] = "pos.note";
70
+ LoadDataModel2["POS_ORDER"] = "pos.order";
71
+ LoadDataModel2["POS_ORDER_LINE"] = "pos.order.line";
72
+ LoadDataModel2["POS_PACK_OPERATION_LOT"] = "pos.pack.operation.lot";
73
+ LoadDataModel2["POS_PAYMENT"] = "pos.payment";
74
+ LoadDataModel2["POS_PAYMENT_METHOD"] = "pos.payment.method";
75
+ LoadDataModel2["POS_PRINTER"] = "pos.printer";
76
+ LoadDataModel2["POS_SESSION"] = "pos.session";
77
+ LoadDataModel2["POS_PREPARATION_DISPLAY_DISPLAY"] = "pos_preparation_display.display";
78
+ LoadDataModel2["PRODUCT_ATTRIBUTE"] = "product.attribute";
79
+ LoadDataModel2["PRODUCT_ATTRIBUTE_CUSTOM_VALUE"] = "product.attribute.custom.value";
80
+ LoadDataModel2["PRODUCT_CATEGORY"] = "product.category";
81
+ LoadDataModel2["PRODUCT_COMBO"] = "product.combo";
82
+ LoadDataModel2["PRODUCT_COMBO_ITEM"] = "product.combo.item";
83
+ LoadDataModel2["PRODUCT_PACKAGING"] = "product.packaging";
84
+ LoadDataModel2["PRODUCT_PRICELIST"] = "product.pricelist";
85
+ LoadDataModel2["PRODUCT_PRICELIST_ITEM"] = "product.pricelist.item";
86
+ LoadDataModel2["PRODUCT_PRODUCT"] = "product.product";
87
+ LoadDataModel2["PRODUCT_TAG"] = "product.tag";
88
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_LINE"] = "product.template.attribute.line";
89
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_VALUE"] = "product.template.attribute.value";
90
+ LoadDataModel2["RES_COMPANY"] = "res.company";
91
+ LoadDataModel2["RES_COUNTRY"] = "res.country";
92
+ LoadDataModel2["RES_COUNTRY_STATE"] = "res.country.state";
93
+ LoadDataModel2["RES_CURRENCY"] = "res.currency";
94
+ LoadDataModel2["RES_LANG"] = "res.lang";
95
+ LoadDataModel2["RES_PARTNER"] = "res.partner";
96
+ LoadDataModel2["RES_USERS"] = "res.users";
97
+ LoadDataModel2["STOCK_PICKING_TYPE"] = "stock.picking.type";
98
+ LoadDataModel2["UOM_CATEGORY"] = "uom.category";
99
+ LoadDataModel2["UOM_UOM"] = "uom.uom";
100
+ LoadDataModel2["LOYALTY_PROGRAM"] = "loyalty.program";
101
+ LoadDataModel2["LOYALTY_RULE"] = "loyalty.rule";
102
+ LoadDataModel2["RESTAURANT_TABLE"] = "restaurant.table";
103
+ LoadDataModel2["RESTAURANT_FLOOR"] = "restaurant.floor";
104
+ LoadDataModel2["POS_MAKE_PAYMENT"] = "pos.make.payment";
105
+ return LoadDataModel2;
106
+ })(LoadDataModel || {});
107
+
56
108
  // src/constants/widget/widget-avatar-constant.ts
57
109
  var WIDGETAVATAR = /* @__PURE__ */ ((WIDGETAVATAR2) => {
58
110
  WIDGETAVATAR2["many2one_avatar_user"] = "many2one_avatar_user";
@@ -2203,13 +2255,6 @@ function cleanObject(obj) {
2203
2255
  }
2204
2256
  return result;
2205
2257
  }
2206
- var extractIdFromDomain = (domain) => {
2207
- if (!domain || !Array.isArray(domain)) return null;
2208
- const idCond = domain.find(
2209
- ([field, operator]) => field === "id" && operator === "="
2210
- );
2211
- return idCond ? Number(idCond[2]) : null;
2212
- };
2213
2258
 
2214
2259
  // src/provider/react-query-provider.tsx
2215
2260
  import { useState as useState2 } from "react";
@@ -2262,7 +2307,7 @@ var initialState2 = {
2262
2307
  lang: "vi_VN",
2263
2308
  tz: "Asia/Saigon"
2264
2309
  },
2265
- isLocalMode: false
2310
+ isSupaMode: false
2266
2311
  };
2267
2312
  var envSlice = createSlice2({
2268
2313
  name: "env",
@@ -2877,6 +2922,21 @@ var ServiceContext = createContext2(null);
2877
2922
  import { useEffect as useEffect3 } from "react";
2878
2923
  import { Fragment as Fragment2, jsx as jsx7 } from "react/jsx-runtime";
2879
2924
 
2925
+ // src/provider/supabase-provider.tsx
2926
+ import { createContext as createContext3, useContext as useContext3, useMemo } from "react";
2927
+ import { createClient } from "@supabase/supabase-js";
2928
+ import { jsx as jsx8 } from "react/jsx-runtime";
2929
+ var SupabaseContext = createContext3(null);
2930
+ var useSupabase = () => {
2931
+ const context = useContext3(SupabaseContext);
2932
+ if (!context) {
2933
+ throw new Error(
2934
+ "useSupabase must be used within a SupabaseProvider or check your env config"
2935
+ );
2936
+ }
2937
+ return context;
2938
+ };
2939
+
2880
2940
  // src/services/action-service/index.ts
2881
2941
  function useActionService() {
2882
2942
  const { env } = useEnv();
@@ -5081,544 +5141,7 @@ var getASessionService = (env) => {
5081
5141
 
5082
5142
  // src/services/pos-service/add-entity.ts
5083
5143
  import { useCallback as useCallback13 } from "react";
5084
-
5085
- // src/services/filesystem-service/file-service.ts
5086
- import { Directory, Encoding, Filesystem } from "@capacitor/filesystem";
5087
- var fileService = {
5088
- read: async (path) => {
5089
- try {
5090
- const res = await Filesystem.readFile({
5091
- path,
5092
- directory: Directory.Data,
5093
- encoding: Encoding.UTF8
5094
- });
5095
- if (typeof res.data === "string") return res.data;
5096
- if (res.data instanceof Blob) return await res.data.text();
5097
- return null;
5098
- } catch {
5099
- return null;
5100
- }
5101
- },
5102
- write: async (path, data) => {
5103
- await Filesystem.writeFile({
5104
- path,
5105
- data,
5106
- directory: Directory.Data,
5107
- encoding: Encoding.UTF8,
5108
- recursive: true
5109
- });
5110
- },
5111
- writeAtomic: async (path, data) => {
5112
- const tempPath = path + ".tmp";
5113
- await Filesystem.writeFile({
5114
- path: tempPath,
5115
- data,
5116
- directory: Directory.Data,
5117
- encoding: Encoding.UTF8,
5118
- recursive: true
5119
- });
5120
- try {
5121
- await Filesystem.deleteFile({
5122
- path,
5123
- directory: Directory.Data
5124
- });
5125
- } catch {
5126
- }
5127
- await Filesystem.rename({
5128
- from: tempPath,
5129
- to: path,
5130
- directory: Directory.Data
5131
- });
5132
- },
5133
- delete: async (path) => {
5134
- try {
5135
- await Filesystem.deleteFile({
5136
- path,
5137
- directory: Directory.Data
5138
- });
5139
- } catch {
5140
- }
5141
- },
5142
- exists: async (path) => {
5143
- try {
5144
- await Filesystem.stat({
5145
- path,
5146
- directory: Directory.Data
5147
- });
5148
- return true;
5149
- } catch {
5150
- return false;
5151
- }
5152
- },
5153
- mkdir: async (path) => {
5154
- try {
5155
- await Filesystem.mkdir({
5156
- path,
5157
- directory: Directory.Data,
5158
- recursive: true
5159
- });
5160
- } catch (e) {
5161
- if (!String(e?.message).includes("Exists")) {
5162
- throw e;
5163
- }
5164
- }
5165
- },
5166
- list: async (path) => {
5167
- return Filesystem.readdir({
5168
- path,
5169
- directory: Directory.Data
5170
- });
5171
- },
5172
- getUri: async (path) => {
5173
- return Filesystem.getUri({
5174
- path,
5175
- directory: Directory.Data
5176
- });
5177
- }
5178
- };
5179
-
5180
- // src/services/filesystem-service/json-worker.ts
5181
- function createWorkerBlob() {
5182
- const workerCode = `
5183
- self.addEventListener("message", async (ev) => {
5184
- const { id, cmd, payload } = ev.data;
5185
- try {
5186
- if (cmd === "parse") {
5187
- const parsed = JSON.parse(payload);
5188
- self.postMessage({ id, ok: true, result: parsed });
5189
- } else if (cmd === "stringify") {
5190
- const str = JSON.stringify(payload);
5191
- self.postMessage({ id, ok: true, result: str });
5192
- }
5193
- } catch (err) {
5194
- self.postMessage({ id, ok: false, error: err?.message || String(err) });
5195
- }
5196
- });
5197
- `;
5198
- const blob = new Blob([workerCode], { type: "application/javascript" });
5199
- return URL.createObjectURL(blob);
5200
- }
5201
- function spawnParseWorker(raw) {
5202
- return new Promise((resolve, reject) => {
5203
- const workerUrl = createWorkerBlob();
5204
- const worker = new Worker(workerUrl);
5205
- const id = Math.random().toString(36).slice(2);
5206
- worker.onmessage = (ev) => {
5207
- const { ok, result, error } = ev.data;
5208
- if (ok) {
5209
- resolve(result);
5210
- } else {
5211
- reject(new Error(error));
5212
- }
5213
- URL.revokeObjectURL(workerUrl);
5214
- worker.terminate();
5215
- };
5216
- worker.onerror = (err) => {
5217
- reject(err);
5218
- URL.revokeObjectURL(workerUrl);
5219
- worker.terminate();
5220
- };
5221
- worker.postMessage({ id, cmd: "parse", payload: raw });
5222
- });
5223
- }
5224
- function spawnStringifyWorker(obj) {
5225
- return new Promise((resolve, reject) => {
5226
- const workerUrl = createWorkerBlob();
5227
- const worker = new Worker(workerUrl);
5228
- worker.onmessage = (ev) => {
5229
- const { ok, result, error } = ev.data;
5230
- if (ok) resolve(result);
5231
- else reject(new Error(error));
5232
- URL.revokeObjectURL(workerUrl);
5233
- worker.terminate();
5234
- };
5235
- worker.onerror = (err) => {
5236
- reject(err);
5237
- URL.revokeObjectURL(workerUrl);
5238
- worker.terminate();
5239
- };
5240
- worker.postMessage({ cmd: "stringify", payload: obj });
5241
- });
5242
- }
5243
-
5244
- // src/services/filesystem-service/manifest.ts
5245
- var MANIFEST_PATH = "pos/manifest.json";
5246
- var MANIFEST_BAK_PATH = "pos/manifest.bak.json";
5247
- async function writeManifest(manifest) {
5248
- const oldRaw = await fileService.read(MANIFEST_PATH);
5249
- if (oldRaw !== null) {
5250
- await fileService.writeAtomic(MANIFEST_BAK_PATH, oldRaw);
5251
- }
5252
- await fileService.writeAtomic(MANIFEST_PATH, JSON.stringify(manifest));
5253
- try {
5254
- await fileService.delete(MANIFEST_BAK_PATH);
5255
- } catch {
5256
- }
5257
- }
5258
-
5259
- // src/services/filesystem-service/import-snapshot.ts
5260
- var DATA_DIR = "pos";
5261
- var MODELS_DIR = `${DATA_DIR}/models`;
5262
- var MODELS_META_DIR = `${DATA_DIR}/models_meta`;
5263
- var importSnapshot = async ({ data, onProgress }) => {
5264
- onProgress?.(1, "Parsing snapshot");
5265
- const parsed = await spawnParseWorker(data);
5266
- const modelNames = Object.keys(parsed);
5267
- const total = modelNames.length;
5268
- const manifest = { version: (/* @__PURE__ */ new Date()).toISOString(), models: {} };
5269
- const TMP_PREFIX = `pos/data/tmp_import_${Date.now()}`;
5270
- await fileService.writeAtomic(`${TMP_PREFIX}/.marker`, "1");
5271
- let i = 0;
5272
- for (const model of modelNames) {
5273
- i++;
5274
- onProgress?.(
5275
- Math.round(i / total * 100),
5276
- `Processing ${model} (${i}/${total})`
5277
- );
5278
- const block = parsed[model];
5279
- const dataPart = block?.data ?? block ?? [];
5280
- const fields = block?.fields ?? [];
5281
- const relations = block?.relations ?? {};
5282
- const serialized = await spawnStringifyWorker(dataPart);
5283
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5284
- await fileService.writeAtomic(tmpModelPath, serialized);
5285
- const meta = {
5286
- fields,
5287
- relations,
5288
- count: Array.isArray(dataPart) ? dataPart.length : 0,
5289
- writtenAt: (/* @__PURE__ */ new Date()).toISOString()
5290
- };
5291
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5292
- await fileService.writeAtomic(tmpMetaPath, JSON.stringify(meta));
5293
- manifest.models[model] = {
5294
- file: `${MODELS_DIR}/${encodeURIComponent(model)}.json`,
5295
- metaFile: `${MODELS_META_DIR}/${encodeURIComponent(model)}.meta.json`,
5296
- count: meta.count,
5297
- updatedAt: meta.writtenAt
5298
- };
5299
- }
5300
- onProgress?.(95, "Committing import (moving files)");
5301
- for (const model of modelNames) {
5302
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5303
- const finalModelPath = `${MODELS_DIR}/${encodeURIComponent(model)}.json`;
5304
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5305
- const finalMetaPath = `${MODELS_META_DIR}/${encodeURIComponent(
5306
- model
5307
- )}.meta.json`;
5308
- const tmpRaw = await fileService.read(tmpModelPath);
5309
- if (tmpRaw !== null) await fileService.writeAtomic(finalModelPath, tmpRaw);
5310
- const tmpMetaRaw = await fileService.read(tmpMetaPath);
5311
- if (tmpMetaRaw !== null)
5312
- await fileService.writeAtomic(finalMetaPath, tmpMetaRaw);
5313
- onProgress?.(
5314
- 95 + Math.round(
5315
- (Object.keys(manifest.models).indexOf(model) + 1) / modelNames.length * 5
5316
- ),
5317
- `Committed ${model}`
5318
- );
5319
- }
5320
- await writeManifest(manifest);
5321
- try {
5322
- for (const model of modelNames) {
5323
- await fileService.delete(
5324
- `${TMP_PREFIX}/${encodeURIComponent(model)}.json`
5325
- );
5326
- await fileService.delete(
5327
- `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`
5328
- );
5329
- }
5330
- await fileService.delete(`${TMP_PREFIX}/.marker`);
5331
- } catch (e) {
5332
- console.log("Failed to cleanup tmp import files:", e);
5333
- }
5334
- onProgress?.(100, "Import complete");
5335
- return manifest;
5336
- };
5337
- var import_snapshot_default = importSnapshot;
5338
-
5339
- // src/services/filesystem-service/memory-cache.ts
5340
- var MemoryCache = class {
5341
- map = /* @__PURE__ */ new Map();
5342
- get(k) {
5343
- const e = this.map.get(k);
5344
- if (!e) return null;
5345
- if (e.ttl && Date.now() - e.t > e.ttl) {
5346
- this.map.delete(k);
5347
- return null;
5348
- }
5349
- return e.value;
5350
- }
5351
- set(k, v, ttl = 5 * 60 * 1e3) {
5352
- this.map.set(k, { value: v, t: Date.now(), ttl });
5353
- }
5354
- del(k) {
5355
- this.map.delete(k);
5356
- }
5357
- clear() {
5358
- this.map.clear();
5359
- }
5360
- };
5361
- var memoryCache = new MemoryCache();
5362
-
5363
- // src/services/filesystem-service/model-loader.ts
5364
- var MODELS_DIR2 = "pos/models";
5365
- var MODELS_META_DIR2 = "pos/models_meta";
5366
- async function loadModelData(modelName, includeMeta = true) {
5367
- const key = `model:${modelName}:meta:${includeMeta}`;
5368
- const cached = memoryCache.get(key);
5369
- if (cached) return cached;
5370
- const dataPath = `${MODELS_DIR2}/${encodeURIComponent(modelName)}.json`;
5371
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5372
- modelName
5373
- )}.meta.json`;
5374
- const rawData = await fileService.read(dataPath);
5375
- if (!rawData) return null;
5376
- const parsedData = await spawnParseWorker(rawData);
5377
- const data = Array.isArray(parsedData) ? parsedData : [];
5378
- if (!includeMeta) {
5379
- const result2 = { data };
5380
- memoryCache.set(key, result2, 1e3 * 60 * 60);
5381
- return result2;
5382
- }
5383
- const rawMeta = await fileService.read(metaPath);
5384
- let fields = [];
5385
- let relations = {};
5386
- if (rawMeta) {
5387
- const parsedMeta = await spawnParseWorker(rawMeta);
5388
- fields = parsedMeta?.fields ?? [];
5389
- relations = parsedMeta?.relations ?? {};
5390
- }
5391
- const result = {
5392
- data,
5393
- fields,
5394
- relations
5395
- };
5396
- memoryCache.set(key, result, 1e3 * 60 * 60);
5397
- return result;
5398
- }
5399
- async function loadData(includeMeta = true) {
5400
- try {
5401
- const listResult = await fileService.list(MODELS_DIR2);
5402
- if (!listResult || !Array.isArray(listResult.files)) {
5403
- console.log("No models found");
5404
- return {};
5405
- }
5406
- const result = {};
5407
- for (const file of listResult.files) {
5408
- if (file.type !== "file") continue;
5409
- if (!file.name.endsWith(".json")) continue;
5410
- const fileName = file.name;
5411
- const modelName = fileName.replace(/\.json$/, "");
5412
- const dataPath = `${MODELS_DIR2}/${fileName}`;
5413
- const rawData = await fileService.read(dataPath);
5414
- if (!rawData) continue;
5415
- const parsedData = await spawnParseWorker(rawData);
5416
- const data = Array.isArray(parsedData) ? parsedData : [];
5417
- if (!includeMeta) {
5418
- result[modelName] = { data };
5419
- continue;
5420
- }
5421
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5422
- modelName
5423
- )}.meta.json`;
5424
- const rawMeta = await fileService.read(metaPath);
5425
- let fields = [];
5426
- let relations = {};
5427
- if (rawMeta) {
5428
- const parsedMeta = await spawnParseWorker(rawMeta);
5429
- fields = parsedMeta?.fields ?? [];
5430
- relations = parsedMeta?.relations ?? {};
5431
- }
5432
- result[modelName] = {
5433
- data,
5434
- fields,
5435
- relations
5436
- };
5437
- }
5438
- return result;
5439
- } catch (error) {
5440
- console.error("Error loading data:", error);
5441
- throw error;
5442
- }
5443
- }
5444
-
5445
- // src/services/filesystem-service/snapshot-helper.ts
5446
- var createEmptySnapshot = () => {
5447
- return {
5448
- data: []
5449
- };
5450
- };
5451
- var generateNextId = (existingIds, startFrom = 1) => {
5452
- if (!existingIds || existingIds.length === 0) {
5453
- return startFrom;
5454
- }
5455
- const maxId = Math.max(...existingIds, startFrom - 1);
5456
- return maxId + 1;
5457
- };
5458
- var loadSnapshot = async ({
5459
- modelName
5460
- }) => {
5461
- try {
5462
- const snapshot = await loadModelData(modelName);
5463
- if (!snapshot || typeof snapshot !== "object") {
5464
- console.warn("invalid snapshot, creating new one");
5465
- return createEmptySnapshot();
5466
- }
5467
- return {
5468
- data: Array.isArray(snapshot.data) ? snapshot.data : []
5469
- };
5470
- } catch (error) {
5471
- console.error("Failed to load snapshot:", error);
5472
- return createEmptySnapshot();
5473
- }
5474
- };
5475
- var getExistingIds = (snapshot) => {
5476
- return snapshot.data.map((order) => order.id).filter((id) => typeof id === "number");
5477
- };
5478
- var saveSnapshot = async ({
5479
- snapshot,
5480
- modelName
5481
- }) => {
5482
- try {
5483
- await import_snapshot_default({
5484
- data: JSON.stringify({
5485
- [modelName]: snapshot
5486
- })
5487
- });
5488
- return true;
5489
- } catch (error) {
5490
- console.error("failed to save snapshot:", error);
5491
- return false;
5492
- }
5493
- };
5494
- var addRecordResponseHandler = ({
5495
- modelName,
5496
- id,
5497
- data
5498
- }) => {
5499
- if (modelName === "restaurant.floor" /* RESTAURANT_FLOOR */ || modelName === "res.partner" /* RES_PARTNER */) {
5500
- return [[id, ""]];
5501
- }
5502
- return data;
5503
- };
5504
-
5505
- // src/services/filesystem-service/model-repository.ts
5506
- var ModelRepository = class {
5507
- getAll = async ({ modelName }) => {
5508
- try {
5509
- const snapshot = await loadSnapshot({
5510
- modelName
5511
- });
5512
- return snapshot.data;
5513
- } catch (error) {
5514
- console.error("failed to get all records:", error);
5515
- return [];
5516
- }
5517
- };
5518
- getRecord = async ({
5519
- id,
5520
- modelName
5521
- }) => {
5522
- try {
5523
- const snapshot = await loadSnapshot({
5524
- modelName
5525
- });
5526
- return snapshot.data.find((record) => record.id === id) || null;
5527
- } catch (error) {
5528
- console.error("failed to get record:", error);
5529
- return null;
5530
- }
5531
- };
5532
- addRecord = async ({
5533
- newRecord,
5534
- modelName
5535
- }) => {
5536
- try {
5537
- const snapshot = await loadSnapshot({
5538
- modelName
5539
- });
5540
- const existingIds = getExistingIds(snapshot);
5541
- const newId = generateNextId(existingIds, snapshot.data.length);
5542
- snapshot.data.push({
5543
- ...newRecord,
5544
- id: newId
5545
- });
5546
- const saved = await saveSnapshot({
5547
- snapshot,
5548
- modelName
5549
- });
5550
- if (!saved) {
5551
- console.error("failed to add new record");
5552
- return [];
5553
- }
5554
- console.log("lib data:", snapshot.data);
5555
- const response = addRecordResponseHandler({
5556
- id: newId,
5557
- modelName,
5558
- data: snapshot.data
5559
- });
5560
- return response;
5561
- } catch (error) {
5562
- console.error("failed to add new record:", error);
5563
- return [];
5564
- }
5565
- };
5566
- updateRecord = async ({
5567
- id,
5568
- update,
5569
- modelName
5570
- }) => {
5571
- try {
5572
- const snapshot = await loadSnapshot({
5573
- modelName
5574
- });
5575
- const index = snapshot.data.findIndex((record) => record.id === id);
5576
- if (index === -1) {
5577
- console.error(`record with id ${id} not found`);
5578
- return false;
5579
- }
5580
- snapshot.data[index] = {
5581
- ...snapshot.data[index],
5582
- ...update
5583
- };
5584
- return await saveSnapshot({
5585
- snapshot,
5586
- modelName
5587
- });
5588
- } catch (error) {
5589
- console.error("error updating record:", error);
5590
- return false;
5591
- }
5592
- };
5593
- deleteRecord = async ({
5594
- id,
5595
- modelName
5596
- }) => {
5597
- try {
5598
- const snapshot = await loadSnapshot({
5599
- modelName
5600
- });
5601
- const before = snapshot.data.length;
5602
- snapshot.data = snapshot.data.filter((record) => record.id !== id);
5603
- if (snapshot.data.length === before) {
5604
- console.error(`record with id ${id} not found`);
5605
- return false;
5606
- }
5607
- return await saveSnapshot({
5608
- snapshot,
5609
- modelName
5610
- });
5611
- } catch (error) {
5612
- console.error("error deleting record:", error);
5613
- return false;
5614
- }
5615
- };
5616
- };
5617
-
5618
- // src/services/pos-service/add-entity.ts
5619
5144
  var addEntityService = (env) => {
5620
- const isLocalMode = env?.isLocalMode;
5621
- const repo = new ModelRepository();
5622
5145
  const addEntity = useCallback13(
5623
5146
  ({
5624
5147
  model,
@@ -5627,12 +5150,6 @@ var addEntityService = (env) => {
5627
5150
  service,
5628
5151
  isCreateEndpoint = false
5629
5152
  }) => {
5630
- if (isLocalMode) {
5631
- return repo.addRecord({
5632
- newRecord: values,
5633
- modelName: model
5634
- });
5635
- }
5636
5153
  const jsonData = {
5637
5154
  model,
5638
5155
  values
@@ -5649,7 +5166,7 @@ var addEntityService = (env) => {
5649
5166
  service
5650
5167
  );
5651
5168
  },
5652
- [env, isLocalMode]
5169
+ [env]
5653
5170
  );
5654
5171
  return {
5655
5172
  addEntity
@@ -5771,8 +5288,6 @@ var createEInvoiceService = (env) => {
5771
5288
  // src/services/pos-service/create-entity.ts
5772
5289
  import { useCallback as useCallback17 } from "react";
5773
5290
  var createEntityService = (env) => {
5774
- const isLocalMode = env?.isLocalMode;
5775
- const repo = new ModelRepository();
5776
5291
  const createEntity = useCallback17(
5777
5292
  ({
5778
5293
  model,
@@ -5780,12 +5295,6 @@ var createEntityService = (env) => {
5780
5295
  xNode,
5781
5296
  service
5782
5297
  }) => {
5783
- if (isLocalMode) {
5784
- return repo.addRecord({
5785
- newRecord: args[0],
5786
- modelName: model
5787
- });
5788
- }
5789
5298
  const jsonData = {
5790
5299
  model,
5791
5300
  method: "create" /* CREATE */,
@@ -5803,7 +5312,7 @@ var createEntityService = (env) => {
5803
5312
  service
5804
5313
  );
5805
5314
  },
5806
- [env, isLocalMode]
5315
+ [env]
5807
5316
  );
5808
5317
  return {
5809
5318
  createEntity
@@ -5888,8 +5397,6 @@ var createSessionService = (env) => {
5888
5397
  // src/services/pos-service/delete-entity.ts
5889
5398
  import { useCallback as useCallback20 } from "react";
5890
5399
  var deleteEntityService = (env) => {
5891
- const isLocalMode = env?.isLocalMode;
5892
- const repo = new ModelRepository();
5893
5400
  const deleteEntity = useCallback20(
5894
5401
  ({
5895
5402
  model,
@@ -5898,14 +5405,6 @@ var deleteEntityService = (env) => {
5898
5405
  service,
5899
5406
  method
5900
5407
  }) => {
5901
- if (isLocalMode) {
5902
- const id = ids[0];
5903
- if (!id) return;
5904
- return repo.deleteRecord({
5905
- modelName: model,
5906
- id
5907
- });
5908
- }
5909
5408
  const jsonData = {
5910
5409
  model,
5911
5410
  ids,
@@ -5923,7 +5422,7 @@ var deleteEntityService = (env) => {
5923
5422
  service
5924
5423
  );
5925
5424
  },
5926
- [env, isLocalMode]
5425
+ [env]
5927
5426
  );
5928
5427
  return {
5929
5428
  deleteEntity
@@ -6000,8 +5499,6 @@ var getCurrentUserService = (env) => {
6000
5499
  // src/services/pos-service/get-list.ts
6001
5500
  import { useCallback as useCallback23 } from "react";
6002
5501
  var getListService = (env) => {
6003
- const isLocalMode = env?.isLocalMode;
6004
- const repo = new ModelRepository();
6005
5502
  const getList = useCallback23(
6006
5503
  async ({
6007
5504
  model,
@@ -6012,12 +5509,6 @@ var getListService = (env) => {
6012
5509
  offset,
6013
5510
  limit
6014
5511
  }) => {
6015
- if (isLocalMode) {
6016
- const data = await repo.getAll({
6017
- modelName: model
6018
- });
6019
- return data;
6020
- }
6021
5512
  const jsonData = {
6022
5513
  model,
6023
5514
  method: "web_search_read" /* WEB_SEARCH_READ */,
@@ -6040,7 +5531,7 @@ var getListService = (env) => {
6040
5531
  service
6041
5532
  );
6042
5533
  },
6043
- [env, isLocalMode]
5534
+ [env]
6044
5535
  );
6045
5536
  return {
6046
5537
  getList
@@ -6369,8 +5860,24 @@ var handleClosingSessionService = (env) => {
6369
5860
 
6370
5861
  // src/services/pos-service/load-data-pos-session.ts
6371
5862
  import { useCallback as useCallback32 } from "react";
5863
+ var MODEL_TO_TABLE = {
5864
+ ["account.tax" /* ACCOUNT_TAX */]: "account_taxes",
5865
+ ["res.company" /* RES_COMPANY */]: "companies",
5866
+ ["res.partner" /* RES_PARTNER */]: "customers",
5867
+ ["res.users" /* RES_USERS */]: "employees",
5868
+ ["loyalty.program" /* LOYALTY_PROGRAM */]: "loyalty_programs",
5869
+ ["loyalty.rule" /* LOYALTY_RULE */]: "loyalty_rules",
5870
+ ["pos.order.line" /* POS_ORDER_LINE */]: "order_lines",
5871
+ ["pos.order" /* POS_ORDER */]: "orders",
5872
+ ["pos.payment.method" /* POS_PAYMENT_METHOD */]: "payment_methods",
5873
+ ["pos.payment" /* POS_PAYMENT */]: "payments",
5874
+ ["product.category" /* PRODUCT_CATEGORY */]: "product_categories",
5875
+ ["product.product" /* PRODUCT_PRODUCT */]: "products",
5876
+ ["restaurant.floor" /* RESTAURANT_FLOOR */]: "restaurant_floors",
5877
+ ["restaurant.table" /* RESTAURANT_TABLE */]: "restaurant_tables"
5878
+ };
6372
5879
  var loadDataPosSessionService = (env) => {
6373
- const isLocalMode = env?.isLocalMode;
5880
+ const supabase = useSupabase();
6374
5881
  const loadDataPosSession = useCallback32(
6375
5882
  async ({
6376
5883
  model,
@@ -6381,10 +5888,6 @@ var loadDataPosSessionService = (env) => {
6381
5888
  modelsToLoad = [],
6382
5889
  searchParams
6383
5890
  }) => {
6384
- if (isLocalMode) {
6385
- const data = await loadData();
6386
- return data;
6387
- }
6388
5891
  const jsonData = {
6389
5892
  model,
6390
5893
  method: "load_data" /* LOAD_DATA */,
@@ -6411,10 +5914,59 @@ var loadDataPosSessionService = (env) => {
6411
5914
  service
6412
5915
  );
6413
5916
  },
6414
- [env, isLocalMode]
5917
+ [env]
6415
5918
  );
5919
+ const loadDataPosSessionSupabase = useCallback32(async () => {
5920
+ try {
5921
+ const allModels = Object.values(LoadDataModel);
5922
+ const promises = allModels.map(async (modelName) => {
5923
+ const tableName = MODEL_TO_TABLE[modelName];
5924
+ if (!tableName) {
5925
+ return {
5926
+ modelName,
5927
+ data: [],
5928
+ fields: {},
5929
+ relations: {}
5930
+ };
5931
+ }
5932
+ const { data, error } = await supabase.from(tableName).select("*");
5933
+ if (error) {
5934
+ console.error(`Error loading ${modelName}:`, error);
5935
+ return {
5936
+ modelName,
5937
+ data: [],
5938
+ fields: {},
5939
+ relations: {}
5940
+ };
5941
+ }
5942
+ return {
5943
+ modelName,
5944
+ data: data || [],
5945
+ fields: {},
5946
+ relations: {}
5947
+ };
5948
+ });
5949
+ const results = await Promise.all(promises);
5950
+ const response = results.reduce(
5951
+ (acc, { modelName, data, fields, relations }) => {
5952
+ acc[modelName] = {
5953
+ data,
5954
+ fields,
5955
+ relations
5956
+ };
5957
+ return acc;
5958
+ },
5959
+ {}
5960
+ );
5961
+ return response;
5962
+ } catch (error) {
5963
+ console.error("Error loading data from Supabase:", error);
5964
+ return {};
5965
+ }
5966
+ }, [supabase]);
6416
5967
  return {
6417
- loadDataPosSession
5968
+ loadDataPosSession,
5969
+ loadDataPosSessionSupabase
6418
5970
  };
6419
5971
  };
6420
5972
 
@@ -6636,8 +6188,6 @@ var updateClosedSessionService = (env) => {
6636
6188
  // src/services/pos-service/update-entity.ts
6637
6189
  import { useCallback as useCallback39 } from "react";
6638
6190
  var updateEntityService = (env) => {
6639
- const isLocalMode = env?.isLocalMode;
6640
- const repo = new ModelRepository();
6641
6191
  const updateEntity = useCallback39(
6642
6192
  ({
6643
6193
  model,
@@ -6647,15 +6197,6 @@ var updateEntityService = (env) => {
6647
6197
  xNode,
6648
6198
  service
6649
6199
  }) => {
6650
- if (isLocalMode) {
6651
- const id = extractIdFromDomain(domain);
6652
- if (!id) return;
6653
- return repo.updateRecord({
6654
- update: values,
6655
- modelName: model,
6656
- id
6657
- });
6658
- }
6659
6200
  const jsonData = {
6660
6201
  model,
6661
6202
  domain,
@@ -6673,7 +6214,7 @@ var updateEntityService = (env) => {
6673
6214
  service
6674
6215
  );
6675
6216
  },
6676
- [env, isLocalMode]
6217
+ [env]
6677
6218
  );
6678
6219
  return {
6679
6220
  updateEntity
@@ -6713,6 +6254,49 @@ var updateOrderStatusService = (env) => {
6713
6254
  };
6714
6255
  };
6715
6256
 
6257
+ // src/services/pos-service/complete-current-stage.ts
6258
+ import { useCallback as useCallback41 } from "react";
6259
+ var completeCurrentStageService = (env) => {
6260
+ const completeCurrentStage = useCallback41(
6261
+ ({
6262
+ ids,
6263
+ withContext,
6264
+ xNode,
6265
+ service,
6266
+ requestStageId
6267
+ }) => {
6268
+ const jsonData = {
6269
+ model: "pos_preparation_display.orderline" /* POS_PREPARATION_ORDER_LINE */,
6270
+ method: "complete_current_stage" /* COMPLETE_CURRENT_STAGE */,
6271
+ ids,
6272
+ kwargs: {
6273
+ request_stage_id: requestStageId
6274
+ },
6275
+ with_context: withContext || {
6276
+ lang: "vi_VN",
6277
+ tz: "Asia/Ho_Chi_Minh",
6278
+ uid: 2
6279
+ }
6280
+ };
6281
+ return env?.requests.post(
6282
+ "/call" /* CALL_PATH */,
6283
+ jsonData,
6284
+ {
6285
+ headers: {
6286
+ "Content-Type": "application/json",
6287
+ ...xNode ? { "X-Node": xNode } : {}
6288
+ }
6289
+ },
6290
+ service
6291
+ );
6292
+ },
6293
+ [env]
6294
+ );
6295
+ return {
6296
+ completeCurrentStage
6297
+ };
6298
+ };
6299
+
6716
6300
  // src/services/pos-service/index.ts
6717
6301
  var serviceFactories = [
6718
6302
  addEntityService,
@@ -6743,7 +6327,8 @@ var serviceFactories = [
6743
6327
  searchJournalService,
6744
6328
  updateClosedSessionService,
6745
6329
  updateEntityService,
6746
- updateOrderStatusService
6330
+ updateOrderStatusService,
6331
+ completeCurrentStageService
6747
6332
  ];
6748
6333
  var usePosService = () => {
6749
6334
  const { env } = useEnv();
@@ -6755,50 +6340,6 @@ var usePosService = () => {
6755
6340
  return service;
6756
6341
  };
6757
6342
 
6758
- // src/services/filesystem-service/init-snapshot.ts
6759
- var isSnapshotReady = async () => {
6760
- try {
6761
- const raw = await fileService.read("pos/manifest.json");
6762
- if (!raw) return false;
6763
- const manifest = JSON.parse(raw);
6764
- if (!manifest.models || typeof manifest.models !== "object") {
6765
- return false;
6766
- }
6767
- const modelEntries = Object.values(manifest.models);
6768
- if (modelEntries.length === 0) return false;
6769
- const firstModel = modelEntries[0];
6770
- if (!firstModel.file) return false;
6771
- const modelExists = await fileService.exists(firstModel.file);
6772
- return modelExists;
6773
- } catch {
6774
- return false;
6775
- }
6776
- };
6777
- async function initSnapshot(onProgress) {
6778
- const ready = await isSnapshotReady();
6779
- if (ready) {
6780
- console.log("skip initialization.");
6781
- return;
6782
- }
6783
- console.log("initializing from data.json...");
6784
- const jsonData = await fetch("/data.json").then((r) => r.text());
6785
- if (!jsonData) {
6786
- console.error("cannot load data.json");
6787
- return;
6788
- }
6789
- await import_snapshot_default({
6790
- data: jsonData,
6791
- onProgress
6792
- });
6793
- }
6794
-
6795
- // src/services/filesystem-service/index.ts
6796
- var useFileSystemService = () => {
6797
- return {
6798
- initSnapshot
6799
- };
6800
- };
6801
-
6802
6343
  // src/hooks/auth/use-forgot-password.ts
6803
6344
  var useForgotPassword = () => {
6804
6345
  const { forgotPassword } = useAuthService();
@@ -7668,9 +7209,9 @@ var BaseModel = class {
7668
7209
  };
7669
7210
 
7670
7211
  // src/hooks/model/use-model.ts
7671
- import { useCallback as useCallback41 } from "react";
7212
+ import { useCallback as useCallback42 } from "react";
7672
7213
  var useModel = () => {
7673
- const initModel = useCallback41((modelData) => {
7214
+ const initModel = useCallback42((modelData) => {
7674
7215
  switch (modelData?.name) {
7675
7216
  default:
7676
7217
  return new BaseModel(modelData);
@@ -8687,8 +8228,9 @@ var use_handle_closing_session_default = useHandleClosingSession;
8687
8228
  import { useMutation as useMutation77 } from "@tanstack/react-query";
8688
8229
  var useLoadDataPosSession = () => {
8689
8230
  const pos = usePosService();
8231
+ const { env } = useEnv();
8690
8232
  return useMutation77({
8691
- mutationFn: pos.loadDataPosSession
8233
+ mutationFn: env.isSupaMode ? pos.loadDataPosSessionSupabase : pos.loadDataPosSession
8692
8234
  });
8693
8235
  };
8694
8236
  var use_load_data_pos_session_default = useLoadDataPosSession;
@@ -8773,21 +8315,22 @@ var useUpdateOrderStatus = () => {
8773
8315
  };
8774
8316
  var use_update_order_status_default = useUpdateOrderStatus;
8775
8317
 
8776
- // src/hooks/pos/use-init-snapshot.ts
8318
+ // src/hooks/pos/use-complete-current-stage.ts
8777
8319
  import { useMutation as useMutation86 } from "@tanstack/react-query";
8778
- var useInitSnapshot = () => {
8779
- const fileSystem = useFileSystemService();
8320
+ var useCompleteCurrentStage = () => {
8321
+ const pos = usePosService();
8780
8322
  return useMutation86({
8781
- mutationFn: fileSystem.initSnapshot
8323
+ mutationFn: pos.completeCurrentStage
8782
8324
  });
8783
8325
  };
8784
- var use_init_snapshot_default = useInitSnapshot;
8326
+ var use_complete_current_stage_default = useCompleteCurrentStage;
8785
8327
  export {
8786
8328
  use_add_entity_default as useAddEntity,
8787
8329
  use_button_default as useButton,
8788
8330
  use_change_order_preparation_state_default as useChangeOrderPreparationState,
8789
8331
  use_change_status_default as useChangeStatus,
8790
8332
  use_check_payment_default as useCheckPayment,
8333
+ use_complete_current_stage_default as useCompleteCurrentStage,
8791
8334
  use_create_e_invoice_default as useCreateEInvoice,
8792
8335
  use_create_entity_default as useCreateEntity,
8793
8336
  use_create_pos_config_default as useCreatePosConfig,
@@ -8855,7 +8398,6 @@ export {
8855
8398
  use_handle_close_session_default as useHandleCloseSession,
8856
8399
  use_handle_closing_detail_session_default as useHandleClosingDetailSession,
8857
8400
  use_handle_closing_session_default as useHandleClosingSession,
8858
- use_init_snapshot_default as useInitSnapshot,
8859
8401
  use_isvalid_token_default as useIsValidToken,
8860
8402
  use_load_action_default as useLoadAction,
8861
8403
  use_load_data_pos_session_default as useLoadDataPosSession,