@fctc/interface-logic 4.4.0 → 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/services.mjs CHANGED
@@ -50,6 +50,58 @@ var UriConstants = /* @__PURE__ */ ((UriConstants2) => {
50
50
  // src/utils/format.ts
51
51
  import moment from "moment";
52
52
 
53
+ // src/constants/model/model-constant.ts
54
+ var LoadDataModel = /* @__PURE__ */ ((LoadDataModel2) => {
55
+ LoadDataModel2["ACCOUNT_CASH_ROUNDING"] = "account.cash.rounding";
56
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION"] = "account.fiscal.position";
57
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION_TAX"] = "account.fiscal.position.tax";
58
+ LoadDataModel2["ACCOUNT_TAX"] = "account.tax";
59
+ LoadDataModel2["ACCOUNT_TAX_GROUP"] = "account.tax.group";
60
+ LoadDataModel2["DECIMAL_PRECISION"] = "decimal.precision";
61
+ LoadDataModel2["IR_MODULE_MODULE"] = "ir.module.module";
62
+ LoadDataModel2["IR_UI_VIEW"] = "ir.ui.view";
63
+ LoadDataModel2["POS_BILL"] = "pos.bill";
64
+ LoadDataModel2["POS_CATEGORY"] = "pos.category";
65
+ LoadDataModel2["POS_CONFIG"] = "pos.config";
66
+ LoadDataModel2["POS_NOTE"] = "pos.note";
67
+ LoadDataModel2["POS_ORDER"] = "pos.order";
68
+ LoadDataModel2["POS_ORDER_LINE"] = "pos.order.line";
69
+ LoadDataModel2["POS_PACK_OPERATION_LOT"] = "pos.pack.operation.lot";
70
+ LoadDataModel2["POS_PAYMENT"] = "pos.payment";
71
+ LoadDataModel2["POS_PAYMENT_METHOD"] = "pos.payment.method";
72
+ LoadDataModel2["POS_PRINTER"] = "pos.printer";
73
+ LoadDataModel2["POS_SESSION"] = "pos.session";
74
+ LoadDataModel2["POS_PREPARATION_DISPLAY_DISPLAY"] = "pos_preparation_display.display";
75
+ LoadDataModel2["PRODUCT_ATTRIBUTE"] = "product.attribute";
76
+ LoadDataModel2["PRODUCT_ATTRIBUTE_CUSTOM_VALUE"] = "product.attribute.custom.value";
77
+ LoadDataModel2["PRODUCT_CATEGORY"] = "product.category";
78
+ LoadDataModel2["PRODUCT_COMBO"] = "product.combo";
79
+ LoadDataModel2["PRODUCT_COMBO_ITEM"] = "product.combo.item";
80
+ LoadDataModel2["PRODUCT_PACKAGING"] = "product.packaging";
81
+ LoadDataModel2["PRODUCT_PRICELIST"] = "product.pricelist";
82
+ LoadDataModel2["PRODUCT_PRICELIST_ITEM"] = "product.pricelist.item";
83
+ LoadDataModel2["PRODUCT_PRODUCT"] = "product.product";
84
+ LoadDataModel2["PRODUCT_TAG"] = "product.tag";
85
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_LINE"] = "product.template.attribute.line";
86
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_VALUE"] = "product.template.attribute.value";
87
+ LoadDataModel2["RES_COMPANY"] = "res.company";
88
+ LoadDataModel2["RES_COUNTRY"] = "res.country";
89
+ LoadDataModel2["RES_COUNTRY_STATE"] = "res.country.state";
90
+ LoadDataModel2["RES_CURRENCY"] = "res.currency";
91
+ LoadDataModel2["RES_LANG"] = "res.lang";
92
+ LoadDataModel2["RES_PARTNER"] = "res.partner";
93
+ LoadDataModel2["RES_USERS"] = "res.users";
94
+ LoadDataModel2["STOCK_PICKING_TYPE"] = "stock.picking.type";
95
+ LoadDataModel2["UOM_CATEGORY"] = "uom.category";
96
+ LoadDataModel2["UOM_UOM"] = "uom.uom";
97
+ LoadDataModel2["LOYALTY_PROGRAM"] = "loyalty.program";
98
+ LoadDataModel2["LOYALTY_RULE"] = "loyalty.rule";
99
+ LoadDataModel2["RESTAURANT_TABLE"] = "restaurant.table";
100
+ LoadDataModel2["RESTAURANT_FLOOR"] = "restaurant.floor";
101
+ LoadDataModel2["POS_MAKE_PAYMENT"] = "pos.make.payment";
102
+ return LoadDataModel2;
103
+ })(LoadDataModel || {});
104
+
53
105
  // src/utils/domain/py_tokenizer.ts
54
106
  var TokenizerError = class extends Error {
55
107
  };
@@ -2178,13 +2230,6 @@ function cleanObject(obj) {
2178
2230
  }
2179
2231
  return result;
2180
2232
  }
2181
- var extractIdFromDomain = (domain) => {
2182
- if (!domain || !Array.isArray(domain)) return null;
2183
- const idCond = domain.find(
2184
- ([field, operator]) => field === "id" && operator === "="
2185
- );
2186
- return idCond ? Number(idCond[2]) : null;
2187
- };
2188
2233
 
2189
2234
  // src/provider/react-query-provider.tsx
2190
2235
  import { useState as useState2 } from "react";
@@ -2237,7 +2282,7 @@ var initialState2 = {
2237
2282
  lang: "vi_VN",
2238
2283
  tz: "Asia/Saigon"
2239
2284
  },
2240
- isLocalMode: false
2285
+ isSupaMode: false
2241
2286
  };
2242
2287
  var envSlice = createSlice2({
2243
2288
  name: "env",
@@ -2844,7 +2889,7 @@ function useEnv() {
2844
2889
  }
2845
2890
 
2846
2891
  // src/provider/service-provider.tsx
2847
- import { createContext as createContext2, useContext as useContext2 } from "react";
2892
+ import { createContext as createContext3, useContext as useContext3 } from "react";
2848
2893
 
2849
2894
  // src/hooks/auth/use-forgot-password.ts
2850
2895
  import { useMutation } from "@tanstack/react-query";
@@ -3148,544 +3193,7 @@ var getASessionService = (env) => {
3148
3193
 
3149
3194
  // src/services/pos-service/add-entity.ts
3150
3195
  import { useCallback as useCallback4 } from "react";
3151
-
3152
- // src/services/filesystem-service/file-service.ts
3153
- import { Directory, Encoding, Filesystem } from "@capacitor/filesystem";
3154
- var fileService = {
3155
- read: async (path) => {
3156
- try {
3157
- const res = await Filesystem.readFile({
3158
- path,
3159
- directory: Directory.Data,
3160
- encoding: Encoding.UTF8
3161
- });
3162
- if (typeof res.data === "string") return res.data;
3163
- if (res.data instanceof Blob) return await res.data.text();
3164
- return null;
3165
- } catch {
3166
- return null;
3167
- }
3168
- },
3169
- write: async (path, data) => {
3170
- await Filesystem.writeFile({
3171
- path,
3172
- data,
3173
- directory: Directory.Data,
3174
- encoding: Encoding.UTF8,
3175
- recursive: true
3176
- });
3177
- },
3178
- writeAtomic: async (path, data) => {
3179
- const tempPath = path + ".tmp";
3180
- await Filesystem.writeFile({
3181
- path: tempPath,
3182
- data,
3183
- directory: Directory.Data,
3184
- encoding: Encoding.UTF8,
3185
- recursive: true
3186
- });
3187
- try {
3188
- await Filesystem.deleteFile({
3189
- path,
3190
- directory: Directory.Data
3191
- });
3192
- } catch {
3193
- }
3194
- await Filesystem.rename({
3195
- from: tempPath,
3196
- to: path,
3197
- directory: Directory.Data
3198
- });
3199
- },
3200
- delete: async (path) => {
3201
- try {
3202
- await Filesystem.deleteFile({
3203
- path,
3204
- directory: Directory.Data
3205
- });
3206
- } catch {
3207
- }
3208
- },
3209
- exists: async (path) => {
3210
- try {
3211
- await Filesystem.stat({
3212
- path,
3213
- directory: Directory.Data
3214
- });
3215
- return true;
3216
- } catch {
3217
- return false;
3218
- }
3219
- },
3220
- mkdir: async (path) => {
3221
- try {
3222
- await Filesystem.mkdir({
3223
- path,
3224
- directory: Directory.Data,
3225
- recursive: true
3226
- });
3227
- } catch (e) {
3228
- if (!String(e?.message).includes("Exists")) {
3229
- throw e;
3230
- }
3231
- }
3232
- },
3233
- list: async (path) => {
3234
- return Filesystem.readdir({
3235
- path,
3236
- directory: Directory.Data
3237
- });
3238
- },
3239
- getUri: async (path) => {
3240
- return Filesystem.getUri({
3241
- path,
3242
- directory: Directory.Data
3243
- });
3244
- }
3245
- };
3246
-
3247
- // src/services/filesystem-service/json-worker.ts
3248
- function createWorkerBlob() {
3249
- const workerCode = `
3250
- self.addEventListener("message", async (ev) => {
3251
- const { id, cmd, payload } = ev.data;
3252
- try {
3253
- if (cmd === "parse") {
3254
- const parsed = JSON.parse(payload);
3255
- self.postMessage({ id, ok: true, result: parsed });
3256
- } else if (cmd === "stringify") {
3257
- const str = JSON.stringify(payload);
3258
- self.postMessage({ id, ok: true, result: str });
3259
- }
3260
- } catch (err) {
3261
- self.postMessage({ id, ok: false, error: err?.message || String(err) });
3262
- }
3263
- });
3264
- `;
3265
- const blob = new Blob([workerCode], { type: "application/javascript" });
3266
- return URL.createObjectURL(blob);
3267
- }
3268
- function spawnParseWorker(raw) {
3269
- return new Promise((resolve, reject) => {
3270
- const workerUrl = createWorkerBlob();
3271
- const worker = new Worker(workerUrl);
3272
- const id = Math.random().toString(36).slice(2);
3273
- worker.onmessage = (ev) => {
3274
- const { ok, result, error } = ev.data;
3275
- if (ok) {
3276
- resolve(result);
3277
- } else {
3278
- reject(new Error(error));
3279
- }
3280
- URL.revokeObjectURL(workerUrl);
3281
- worker.terminate();
3282
- };
3283
- worker.onerror = (err) => {
3284
- reject(err);
3285
- URL.revokeObjectURL(workerUrl);
3286
- worker.terminate();
3287
- };
3288
- worker.postMessage({ id, cmd: "parse", payload: raw });
3289
- });
3290
- }
3291
- function spawnStringifyWorker(obj) {
3292
- return new Promise((resolve, reject) => {
3293
- const workerUrl = createWorkerBlob();
3294
- const worker = new Worker(workerUrl);
3295
- worker.onmessage = (ev) => {
3296
- const { ok, result, error } = ev.data;
3297
- if (ok) resolve(result);
3298
- else reject(new Error(error));
3299
- URL.revokeObjectURL(workerUrl);
3300
- worker.terminate();
3301
- };
3302
- worker.onerror = (err) => {
3303
- reject(err);
3304
- URL.revokeObjectURL(workerUrl);
3305
- worker.terminate();
3306
- };
3307
- worker.postMessage({ cmd: "stringify", payload: obj });
3308
- });
3309
- }
3310
-
3311
- // src/services/filesystem-service/manifest.ts
3312
- var MANIFEST_PATH = "pos/manifest.json";
3313
- var MANIFEST_BAK_PATH = "pos/manifest.bak.json";
3314
- async function writeManifest(manifest) {
3315
- const oldRaw = await fileService.read(MANIFEST_PATH);
3316
- if (oldRaw !== null) {
3317
- await fileService.writeAtomic(MANIFEST_BAK_PATH, oldRaw);
3318
- }
3319
- await fileService.writeAtomic(MANIFEST_PATH, JSON.stringify(manifest));
3320
- try {
3321
- await fileService.delete(MANIFEST_BAK_PATH);
3322
- } catch {
3323
- }
3324
- }
3325
-
3326
- // src/services/filesystem-service/import-snapshot.ts
3327
- var DATA_DIR = "pos";
3328
- var MODELS_DIR = `${DATA_DIR}/models`;
3329
- var MODELS_META_DIR = `${DATA_DIR}/models_meta`;
3330
- var importSnapshot = async ({ data, onProgress }) => {
3331
- onProgress?.(1, "Parsing snapshot");
3332
- const parsed = await spawnParseWorker(data);
3333
- const modelNames = Object.keys(parsed);
3334
- const total = modelNames.length;
3335
- const manifest = { version: (/* @__PURE__ */ new Date()).toISOString(), models: {} };
3336
- const TMP_PREFIX = `pos/data/tmp_import_${Date.now()}`;
3337
- await fileService.writeAtomic(`${TMP_PREFIX}/.marker`, "1");
3338
- let i = 0;
3339
- for (const model of modelNames) {
3340
- i++;
3341
- onProgress?.(
3342
- Math.round(i / total * 100),
3343
- `Processing ${model} (${i}/${total})`
3344
- );
3345
- const block = parsed[model];
3346
- const dataPart = block?.data ?? block ?? [];
3347
- const fields = block?.fields ?? [];
3348
- const relations = block?.relations ?? {};
3349
- const serialized = await spawnStringifyWorker(dataPart);
3350
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
3351
- await fileService.writeAtomic(tmpModelPath, serialized);
3352
- const meta = {
3353
- fields,
3354
- relations,
3355
- count: Array.isArray(dataPart) ? dataPart.length : 0,
3356
- writtenAt: (/* @__PURE__ */ new Date()).toISOString()
3357
- };
3358
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
3359
- await fileService.writeAtomic(tmpMetaPath, JSON.stringify(meta));
3360
- manifest.models[model] = {
3361
- file: `${MODELS_DIR}/${encodeURIComponent(model)}.json`,
3362
- metaFile: `${MODELS_META_DIR}/${encodeURIComponent(model)}.meta.json`,
3363
- count: meta.count,
3364
- updatedAt: meta.writtenAt
3365
- };
3366
- }
3367
- onProgress?.(95, "Committing import (moving files)");
3368
- for (const model of modelNames) {
3369
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
3370
- const finalModelPath = `${MODELS_DIR}/${encodeURIComponent(model)}.json`;
3371
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
3372
- const finalMetaPath = `${MODELS_META_DIR}/${encodeURIComponent(
3373
- model
3374
- )}.meta.json`;
3375
- const tmpRaw = await fileService.read(tmpModelPath);
3376
- if (tmpRaw !== null) await fileService.writeAtomic(finalModelPath, tmpRaw);
3377
- const tmpMetaRaw = await fileService.read(tmpMetaPath);
3378
- if (tmpMetaRaw !== null)
3379
- await fileService.writeAtomic(finalMetaPath, tmpMetaRaw);
3380
- onProgress?.(
3381
- 95 + Math.round(
3382
- (Object.keys(manifest.models).indexOf(model) + 1) / modelNames.length * 5
3383
- ),
3384
- `Committed ${model}`
3385
- );
3386
- }
3387
- await writeManifest(manifest);
3388
- try {
3389
- for (const model of modelNames) {
3390
- await fileService.delete(
3391
- `${TMP_PREFIX}/${encodeURIComponent(model)}.json`
3392
- );
3393
- await fileService.delete(
3394
- `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`
3395
- );
3396
- }
3397
- await fileService.delete(`${TMP_PREFIX}/.marker`);
3398
- } catch (e) {
3399
- console.log("Failed to cleanup tmp import files:", e);
3400
- }
3401
- onProgress?.(100, "Import complete");
3402
- return manifest;
3403
- };
3404
- var import_snapshot_default = importSnapshot;
3405
-
3406
- // src/services/filesystem-service/memory-cache.ts
3407
- var MemoryCache = class {
3408
- map = /* @__PURE__ */ new Map();
3409
- get(k) {
3410
- const e = this.map.get(k);
3411
- if (!e) return null;
3412
- if (e.ttl && Date.now() - e.t > e.ttl) {
3413
- this.map.delete(k);
3414
- return null;
3415
- }
3416
- return e.value;
3417
- }
3418
- set(k, v, ttl = 5 * 60 * 1e3) {
3419
- this.map.set(k, { value: v, t: Date.now(), ttl });
3420
- }
3421
- del(k) {
3422
- this.map.delete(k);
3423
- }
3424
- clear() {
3425
- this.map.clear();
3426
- }
3427
- };
3428
- var memoryCache = new MemoryCache();
3429
-
3430
- // src/services/filesystem-service/model-loader.ts
3431
- var MODELS_DIR2 = "pos/models";
3432
- var MODELS_META_DIR2 = "pos/models_meta";
3433
- async function loadModelData(modelName, includeMeta = true) {
3434
- const key = `model:${modelName}:meta:${includeMeta}`;
3435
- const cached = memoryCache.get(key);
3436
- if (cached) return cached;
3437
- const dataPath = `${MODELS_DIR2}/${encodeURIComponent(modelName)}.json`;
3438
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
3439
- modelName
3440
- )}.meta.json`;
3441
- const rawData = await fileService.read(dataPath);
3442
- if (!rawData) return null;
3443
- const parsedData = await spawnParseWorker(rawData);
3444
- const data = Array.isArray(parsedData) ? parsedData : [];
3445
- if (!includeMeta) {
3446
- const result2 = { data };
3447
- memoryCache.set(key, result2, 1e3 * 60 * 60);
3448
- return result2;
3449
- }
3450
- const rawMeta = await fileService.read(metaPath);
3451
- let fields = [];
3452
- let relations = {};
3453
- if (rawMeta) {
3454
- const parsedMeta = await spawnParseWorker(rawMeta);
3455
- fields = parsedMeta?.fields ?? [];
3456
- relations = parsedMeta?.relations ?? {};
3457
- }
3458
- const result = {
3459
- data,
3460
- fields,
3461
- relations
3462
- };
3463
- memoryCache.set(key, result, 1e3 * 60 * 60);
3464
- return result;
3465
- }
3466
- async function loadData(includeMeta = true) {
3467
- try {
3468
- const listResult = await fileService.list(MODELS_DIR2);
3469
- if (!listResult || !Array.isArray(listResult.files)) {
3470
- console.log("No models found");
3471
- return {};
3472
- }
3473
- const result = {};
3474
- for (const file of listResult.files) {
3475
- if (file.type !== "file") continue;
3476
- if (!file.name.endsWith(".json")) continue;
3477
- const fileName = file.name;
3478
- const modelName = fileName.replace(/\.json$/, "");
3479
- const dataPath = `${MODELS_DIR2}/${fileName}`;
3480
- const rawData = await fileService.read(dataPath);
3481
- if (!rawData) continue;
3482
- const parsedData = await spawnParseWorker(rawData);
3483
- const data = Array.isArray(parsedData) ? parsedData : [];
3484
- if (!includeMeta) {
3485
- result[modelName] = { data };
3486
- continue;
3487
- }
3488
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
3489
- modelName
3490
- )}.meta.json`;
3491
- const rawMeta = await fileService.read(metaPath);
3492
- let fields = [];
3493
- let relations = {};
3494
- if (rawMeta) {
3495
- const parsedMeta = await spawnParseWorker(rawMeta);
3496
- fields = parsedMeta?.fields ?? [];
3497
- relations = parsedMeta?.relations ?? {};
3498
- }
3499
- result[modelName] = {
3500
- data,
3501
- fields,
3502
- relations
3503
- };
3504
- }
3505
- return result;
3506
- } catch (error) {
3507
- console.error("Error loading data:", error);
3508
- throw error;
3509
- }
3510
- }
3511
-
3512
- // src/services/filesystem-service/snapshot-helper.ts
3513
- var createEmptySnapshot = () => {
3514
- return {
3515
- data: []
3516
- };
3517
- };
3518
- var generateNextId = (existingIds, startFrom = 1) => {
3519
- if (!existingIds || existingIds.length === 0) {
3520
- return startFrom;
3521
- }
3522
- const maxId = Math.max(...existingIds, startFrom - 1);
3523
- return maxId + 1;
3524
- };
3525
- var loadSnapshot = async ({
3526
- modelName
3527
- }) => {
3528
- try {
3529
- const snapshot = await loadModelData(modelName);
3530
- if (!snapshot || typeof snapshot !== "object") {
3531
- console.warn("invalid snapshot, creating new one");
3532
- return createEmptySnapshot();
3533
- }
3534
- return {
3535
- data: Array.isArray(snapshot.data) ? snapshot.data : []
3536
- };
3537
- } catch (error) {
3538
- console.error("Failed to load snapshot:", error);
3539
- return createEmptySnapshot();
3540
- }
3541
- };
3542
- var getExistingIds = (snapshot) => {
3543
- return snapshot.data.map((order) => order.id).filter((id) => typeof id === "number");
3544
- };
3545
- var saveSnapshot = async ({
3546
- snapshot,
3547
- modelName
3548
- }) => {
3549
- try {
3550
- await import_snapshot_default({
3551
- data: JSON.stringify({
3552
- [modelName]: snapshot
3553
- })
3554
- });
3555
- return true;
3556
- } catch (error) {
3557
- console.error("failed to save snapshot:", error);
3558
- return false;
3559
- }
3560
- };
3561
- var addRecordResponseHandler = ({
3562
- modelName,
3563
- id,
3564
- data
3565
- }) => {
3566
- if (modelName === "restaurant.floor" /* RESTAURANT_FLOOR */ || modelName === "res.partner" /* RES_PARTNER */) {
3567
- return [[id, ""]];
3568
- }
3569
- return data;
3570
- };
3571
-
3572
- // src/services/filesystem-service/model-repository.ts
3573
- var ModelRepository = class {
3574
- getAll = async ({ modelName }) => {
3575
- try {
3576
- const snapshot = await loadSnapshot({
3577
- modelName
3578
- });
3579
- return snapshot.data;
3580
- } catch (error) {
3581
- console.error("failed to get all records:", error);
3582
- return [];
3583
- }
3584
- };
3585
- getRecord = async ({
3586
- id,
3587
- modelName
3588
- }) => {
3589
- try {
3590
- const snapshot = await loadSnapshot({
3591
- modelName
3592
- });
3593
- return snapshot.data.find((record) => record.id === id) || null;
3594
- } catch (error) {
3595
- console.error("failed to get record:", error);
3596
- return null;
3597
- }
3598
- };
3599
- addRecord = async ({
3600
- newRecord,
3601
- modelName
3602
- }) => {
3603
- try {
3604
- const snapshot = await loadSnapshot({
3605
- modelName
3606
- });
3607
- const existingIds = getExistingIds(snapshot);
3608
- const newId = generateNextId(existingIds, snapshot.data.length);
3609
- snapshot.data.push({
3610
- ...newRecord,
3611
- id: newId
3612
- });
3613
- const saved = await saveSnapshot({
3614
- snapshot,
3615
- modelName
3616
- });
3617
- if (!saved) {
3618
- console.error("failed to add new record");
3619
- return [];
3620
- }
3621
- console.log("lib data:", snapshot.data);
3622
- const response = addRecordResponseHandler({
3623
- id: newId,
3624
- modelName,
3625
- data: snapshot.data
3626
- });
3627
- return response;
3628
- } catch (error) {
3629
- console.error("failed to add new record:", error);
3630
- return [];
3631
- }
3632
- };
3633
- updateRecord = async ({
3634
- id,
3635
- update,
3636
- modelName
3637
- }) => {
3638
- try {
3639
- const snapshot = await loadSnapshot({
3640
- modelName
3641
- });
3642
- const index = snapshot.data.findIndex((record) => record.id === id);
3643
- if (index === -1) {
3644
- console.error(`record with id ${id} not found`);
3645
- return false;
3646
- }
3647
- snapshot.data[index] = {
3648
- ...snapshot.data[index],
3649
- ...update
3650
- };
3651
- return await saveSnapshot({
3652
- snapshot,
3653
- modelName
3654
- });
3655
- } catch (error) {
3656
- console.error("error updating record:", error);
3657
- return false;
3658
- }
3659
- };
3660
- deleteRecord = async ({
3661
- id,
3662
- modelName
3663
- }) => {
3664
- try {
3665
- const snapshot = await loadSnapshot({
3666
- modelName
3667
- });
3668
- const before = snapshot.data.length;
3669
- snapshot.data = snapshot.data.filter((record) => record.id !== id);
3670
- if (snapshot.data.length === before) {
3671
- console.error(`record with id ${id} not found`);
3672
- return false;
3673
- }
3674
- return await saveSnapshot({
3675
- snapshot,
3676
- modelName
3677
- });
3678
- } catch (error) {
3679
- console.error("error deleting record:", error);
3680
- return false;
3681
- }
3682
- };
3683
- };
3684
-
3685
- // src/services/pos-service/add-entity.ts
3686
3196
  var addEntityService = (env) => {
3687
- const isLocalMode = env?.isLocalMode;
3688
- const repo = new ModelRepository();
3689
3197
  const addEntity = useCallback4(
3690
3198
  ({
3691
3199
  model,
@@ -3694,12 +3202,6 @@ var addEntityService = (env) => {
3694
3202
  service,
3695
3203
  isCreateEndpoint = false
3696
3204
  }) => {
3697
- if (isLocalMode) {
3698
- return repo.addRecord({
3699
- newRecord: values,
3700
- modelName: model
3701
- });
3702
- }
3703
3205
  const jsonData = {
3704
3206
  model,
3705
3207
  values
@@ -3716,7 +3218,7 @@ var addEntityService = (env) => {
3716
3218
  service
3717
3219
  );
3718
3220
  },
3719
- [env, isLocalMode]
3221
+ [env]
3720
3222
  );
3721
3223
  return {
3722
3224
  addEntity
@@ -3838,8 +3340,6 @@ var createEInvoiceService = (env) => {
3838
3340
  // src/services/pos-service/create-entity.ts
3839
3341
  import { useCallback as useCallback8 } from "react";
3840
3342
  var createEntityService = (env) => {
3841
- const isLocalMode = env?.isLocalMode;
3842
- const repo = new ModelRepository();
3843
3343
  const createEntity = useCallback8(
3844
3344
  ({
3845
3345
  model,
@@ -3847,12 +3347,6 @@ var createEntityService = (env) => {
3847
3347
  xNode,
3848
3348
  service
3849
3349
  }) => {
3850
- if (isLocalMode) {
3851
- return repo.addRecord({
3852
- newRecord: args[0],
3853
- modelName: model
3854
- });
3855
- }
3856
3350
  const jsonData = {
3857
3351
  model,
3858
3352
  method: "create" /* CREATE */,
@@ -3870,7 +3364,7 @@ var createEntityService = (env) => {
3870
3364
  service
3871
3365
  );
3872
3366
  },
3873
- [env, isLocalMode]
3367
+ [env]
3874
3368
  );
3875
3369
  return {
3876
3370
  createEntity
@@ -3955,8 +3449,6 @@ var createSessionService = (env) => {
3955
3449
  // src/services/pos-service/delete-entity.ts
3956
3450
  import { useCallback as useCallback11 } from "react";
3957
3451
  var deleteEntityService = (env) => {
3958
- const isLocalMode = env?.isLocalMode;
3959
- const repo = new ModelRepository();
3960
3452
  const deleteEntity = useCallback11(
3961
3453
  ({
3962
3454
  model,
@@ -3965,14 +3457,6 @@ var deleteEntityService = (env) => {
3965
3457
  service,
3966
3458
  method
3967
3459
  }) => {
3968
- if (isLocalMode) {
3969
- const id = ids[0];
3970
- if (!id) return;
3971
- return repo.deleteRecord({
3972
- modelName: model,
3973
- id
3974
- });
3975
- }
3976
3460
  const jsonData = {
3977
3461
  model,
3978
3462
  ids,
@@ -3990,7 +3474,7 @@ var deleteEntityService = (env) => {
3990
3474
  service
3991
3475
  );
3992
3476
  },
3993
- [env, isLocalMode]
3477
+ [env]
3994
3478
  );
3995
3479
  return {
3996
3480
  deleteEntity
@@ -4067,8 +3551,6 @@ var getCurrentUserService = (env) => {
4067
3551
  // src/services/pos-service/get-list.ts
4068
3552
  import { useCallback as useCallback14 } from "react";
4069
3553
  var getListService = (env) => {
4070
- const isLocalMode = env?.isLocalMode;
4071
- const repo = new ModelRepository();
4072
3554
  const getList = useCallback14(
4073
3555
  async ({
4074
3556
  model,
@@ -4079,12 +3561,6 @@ var getListService = (env) => {
4079
3561
  offset,
4080
3562
  limit
4081
3563
  }) => {
4082
- if (isLocalMode) {
4083
- const data = await repo.getAll({
4084
- modelName: model
4085
- });
4086
- return data;
4087
- }
4088
3564
  const jsonData = {
4089
3565
  model,
4090
3566
  method: "web_search_read" /* WEB_SEARCH_READ */,
@@ -4107,7 +3583,7 @@ var getListService = (env) => {
4107
3583
  service
4108
3584
  );
4109
3585
  },
4110
- [env, isLocalMode]
3586
+ [env]
4111
3587
  );
4112
3588
  return {
4113
3589
  getList
@@ -4436,8 +3912,41 @@ var handleClosingSessionService = (env) => {
4436
3912
 
4437
3913
  // src/services/pos-service/load-data-pos-session.ts
4438
3914
  import { useCallback as useCallback23 } from "react";
3915
+
3916
+ // src/provider/supabase-provider.tsx
3917
+ import { createContext as createContext2, useContext as useContext2, useMemo } from "react";
3918
+ import { createClient } from "@supabase/supabase-js";
3919
+ import { jsx as jsx6 } from "react/jsx-runtime";
3920
+ var SupabaseContext = createContext2(null);
3921
+ var useSupabase = () => {
3922
+ const context = useContext2(SupabaseContext);
3923
+ if (!context) {
3924
+ throw new Error(
3925
+ "useSupabase must be used within a SupabaseProvider or check your env config"
3926
+ );
3927
+ }
3928
+ return context;
3929
+ };
3930
+
3931
+ // src/services/pos-service/load-data-pos-session.ts
3932
+ var MODEL_TO_TABLE = {
3933
+ ["account.tax" /* ACCOUNT_TAX */]: "account_taxes",
3934
+ ["res.company" /* RES_COMPANY */]: "companies",
3935
+ ["res.partner" /* RES_PARTNER */]: "customers",
3936
+ ["res.users" /* RES_USERS */]: "employees",
3937
+ ["loyalty.program" /* LOYALTY_PROGRAM */]: "loyalty_programs",
3938
+ ["loyalty.rule" /* LOYALTY_RULE */]: "loyalty_rules",
3939
+ ["pos.order.line" /* POS_ORDER_LINE */]: "order_lines",
3940
+ ["pos.order" /* POS_ORDER */]: "orders",
3941
+ ["pos.payment.method" /* POS_PAYMENT_METHOD */]: "payment_methods",
3942
+ ["pos.payment" /* POS_PAYMENT */]: "payments",
3943
+ ["product.category" /* PRODUCT_CATEGORY */]: "product_categories",
3944
+ ["product.product" /* PRODUCT_PRODUCT */]: "products",
3945
+ ["restaurant.floor" /* RESTAURANT_FLOOR */]: "restaurant_floors",
3946
+ ["restaurant.table" /* RESTAURANT_TABLE */]: "restaurant_tables"
3947
+ };
4439
3948
  var loadDataPosSessionService = (env) => {
4440
- const isLocalMode = env?.isLocalMode;
3949
+ const supabase = useSupabase();
4441
3950
  const loadDataPosSession = useCallback23(
4442
3951
  async ({
4443
3952
  model,
@@ -4448,10 +3957,6 @@ var loadDataPosSessionService = (env) => {
4448
3957
  modelsToLoad = [],
4449
3958
  searchParams
4450
3959
  }) => {
4451
- if (isLocalMode) {
4452
- const data = await loadData();
4453
- return data;
4454
- }
4455
3960
  const jsonData = {
4456
3961
  model,
4457
3962
  method: "load_data" /* LOAD_DATA */,
@@ -4478,10 +3983,59 @@ var loadDataPosSessionService = (env) => {
4478
3983
  service
4479
3984
  );
4480
3985
  },
4481
- [env, isLocalMode]
3986
+ [env]
4482
3987
  );
3988
+ const loadDataPosSessionSupabase = useCallback23(async () => {
3989
+ try {
3990
+ const allModels = Object.values(LoadDataModel);
3991
+ const promises = allModels.map(async (modelName) => {
3992
+ const tableName = MODEL_TO_TABLE[modelName];
3993
+ if (!tableName) {
3994
+ return {
3995
+ modelName,
3996
+ data: [],
3997
+ fields: {},
3998
+ relations: {}
3999
+ };
4000
+ }
4001
+ const { data, error } = await supabase.from(tableName).select("*");
4002
+ if (error) {
4003
+ console.error(`Error loading ${modelName}:`, error);
4004
+ return {
4005
+ modelName,
4006
+ data: [],
4007
+ fields: {},
4008
+ relations: {}
4009
+ };
4010
+ }
4011
+ return {
4012
+ modelName,
4013
+ data: data || [],
4014
+ fields: {},
4015
+ relations: {}
4016
+ };
4017
+ });
4018
+ const results = await Promise.all(promises);
4019
+ const response = results.reduce(
4020
+ (acc, { modelName, data, fields, relations }) => {
4021
+ acc[modelName] = {
4022
+ data,
4023
+ fields,
4024
+ relations
4025
+ };
4026
+ return acc;
4027
+ },
4028
+ {}
4029
+ );
4030
+ return response;
4031
+ } catch (error) {
4032
+ console.error("Error loading data from Supabase:", error);
4033
+ return {};
4034
+ }
4035
+ }, [supabase]);
4483
4036
  return {
4484
- loadDataPosSession
4037
+ loadDataPosSession,
4038
+ loadDataPosSessionSupabase
4485
4039
  };
4486
4040
  };
4487
4041
 
@@ -4703,8 +4257,6 @@ var updateClosedSessionService = (env) => {
4703
4257
  // src/services/pos-service/update-entity.ts
4704
4258
  import { useCallback as useCallback30 } from "react";
4705
4259
  var updateEntityService = (env) => {
4706
- const isLocalMode = env?.isLocalMode;
4707
- const repo = new ModelRepository();
4708
4260
  const updateEntity = useCallback30(
4709
4261
  ({
4710
4262
  model,
@@ -4714,15 +4266,6 @@ var updateEntityService = (env) => {
4714
4266
  xNode,
4715
4267
  service
4716
4268
  }) => {
4717
- if (isLocalMode) {
4718
- const id = extractIdFromDomain(domain);
4719
- if (!id) return;
4720
- return repo.updateRecord({
4721
- update: values,
4722
- modelName: model,
4723
- id
4724
- });
4725
- }
4726
4269
  const jsonData = {
4727
4270
  model,
4728
4271
  domain,
@@ -4740,7 +4283,7 @@ var updateEntityService = (env) => {
4740
4283
  service
4741
4284
  );
4742
4285
  },
4743
- [env, isLocalMode]
4286
+ [env]
4744
4287
  );
4745
4288
  return {
4746
4289
  updateEntity
@@ -4950,19 +4493,16 @@ import { useMutation as useMutation84 } from "@tanstack/react-query";
4950
4493
  // src/hooks/pos/use-update-order-status.ts
4951
4494
  import { useMutation as useMutation85 } from "@tanstack/react-query";
4952
4495
 
4953
- // src/hooks/pos/use-init-snapshot.ts
4954
- import { useMutation as useMutation86 } from "@tanstack/react-query";
4955
-
4956
4496
  // src/hooks/pos/use-complete-current-stage.ts
4957
- import { useMutation as useMutation87 } from "@tanstack/react-query";
4497
+ import { useMutation as useMutation86 } from "@tanstack/react-query";
4958
4498
 
4959
4499
  // src/provider/service-provider.tsx
4960
- import { jsx as jsx6 } from "react/jsx-runtime";
4961
- var ServiceContext = createContext2(null);
4500
+ import { jsx as jsx7 } from "react/jsx-runtime";
4501
+ var ServiceContext = createContext3(null);
4962
4502
 
4963
4503
  // src/provider/meta-provider.tsx
4964
4504
  import { useEffect as useEffect3 } from "react";
4965
- import { Fragment as Fragment2, jsx as jsx7 } from "react/jsx-runtime";
4505
+ import { Fragment as Fragment2, jsx as jsx8 } from "react/jsx-runtime";
4966
4506
 
4967
4507
  // src/services/action-service/index.ts
4968
4508
  function useActionService() {
@@ -7114,57 +6654,12 @@ function useDashboardService() {
7114
6654
  );
7115
6655
  return { readGroup, getDataChart };
7116
6656
  }
7117
-
7118
- // src/services/filesystem-service/init-snapshot.ts
7119
- var isSnapshotReady = async () => {
7120
- try {
7121
- const raw = await fileService.read("pos/manifest.json");
7122
- if (!raw) return false;
7123
- const manifest = JSON.parse(raw);
7124
- if (!manifest.models || typeof manifest.models !== "object") {
7125
- return false;
7126
- }
7127
- const modelEntries = Object.values(manifest.models);
7128
- if (modelEntries.length === 0) return false;
7129
- const firstModel = modelEntries[0];
7130
- if (!firstModel.file) return false;
7131
- const modelExists = await fileService.exists(firstModel.file);
7132
- return modelExists;
7133
- } catch {
7134
- return false;
7135
- }
7136
- };
7137
- async function initSnapshot(onProgress) {
7138
- const ready = await isSnapshotReady();
7139
- if (ready) {
7140
- console.log("skip initialization.");
7141
- return;
7142
- }
7143
- console.log("initializing from data.json...");
7144
- const jsonData = await fetch("/data.json").then((r) => r.text());
7145
- if (!jsonData) {
7146
- console.error("cannot load data.json");
7147
- return;
7148
- }
7149
- await import_snapshot_default({
7150
- data: jsonData,
7151
- onProgress
7152
- });
7153
- }
7154
-
7155
- // src/services/filesystem-service/index.ts
7156
- var useFileSystemService = () => {
7157
- return {
7158
- initSnapshot
7159
- };
7160
- };
7161
6657
  export {
7162
6658
  useActionService,
7163
6659
  useAuthService,
7164
6660
  useCompanyService,
7165
6661
  useDashboardService,
7166
6662
  useExcelService,
7167
- useFileSystemService,
7168
6663
  useFormService,
7169
6664
  useKanbanService,
7170
6665
  useModelService,