@fctc/interface-logic 4.4.0 → 4.4.2

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/provider.mjs CHANGED
@@ -64,7 +64,7 @@ var initialState2 = {
64
64
  lang: "vi_VN",
65
65
  tz: "Asia/Saigon"
66
66
  },
67
- isLocalMode: false
67
+ isSupaMode: false
68
68
  };
69
69
  var envSlice = createSlice2({
70
70
  name: "env",
@@ -710,6 +710,58 @@ var UriConstants = /* @__PURE__ */ ((UriConstants2) => {
710
710
  // src/utils/format.ts
711
711
  import moment from "moment";
712
712
 
713
+ // src/constants/model/model-constant.ts
714
+ var LoadDataModel = /* @__PURE__ */ ((LoadDataModel2) => {
715
+ LoadDataModel2["ACCOUNT_CASH_ROUNDING"] = "account.cash.rounding";
716
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION"] = "account.fiscal.position";
717
+ LoadDataModel2["ACCOUNT_FISCAL_POSITION_TAX"] = "account.fiscal.position.tax";
718
+ LoadDataModel2["ACCOUNT_TAX"] = "account.tax";
719
+ LoadDataModel2["ACCOUNT_TAX_GROUP"] = "account.tax.group";
720
+ LoadDataModel2["DECIMAL_PRECISION"] = "decimal.precision";
721
+ LoadDataModel2["IR_MODULE_MODULE"] = "ir.module.module";
722
+ LoadDataModel2["IR_UI_VIEW"] = "ir.ui.view";
723
+ LoadDataModel2["POS_BILL"] = "pos.bill";
724
+ LoadDataModel2["POS_CATEGORY"] = "pos.category";
725
+ LoadDataModel2["POS_CONFIG"] = "pos.config";
726
+ LoadDataModel2["POS_NOTE"] = "pos.note";
727
+ LoadDataModel2["POS_ORDER"] = "pos.order";
728
+ LoadDataModel2["POS_ORDER_LINE"] = "pos.order.line";
729
+ LoadDataModel2["POS_PACK_OPERATION_LOT"] = "pos.pack.operation.lot";
730
+ LoadDataModel2["POS_PAYMENT"] = "pos.payment";
731
+ LoadDataModel2["POS_PAYMENT_METHOD"] = "pos.payment.method";
732
+ LoadDataModel2["POS_PRINTER"] = "pos.printer";
733
+ LoadDataModel2["POS_SESSION"] = "pos.session";
734
+ LoadDataModel2["POS_PREPARATION_DISPLAY_DISPLAY"] = "pos_preparation_display.display";
735
+ LoadDataModel2["PRODUCT_ATTRIBUTE"] = "product.attribute";
736
+ LoadDataModel2["PRODUCT_ATTRIBUTE_CUSTOM_VALUE"] = "product.attribute.custom.value";
737
+ LoadDataModel2["PRODUCT_CATEGORY"] = "product.category";
738
+ LoadDataModel2["PRODUCT_COMBO"] = "product.combo";
739
+ LoadDataModel2["PRODUCT_COMBO_ITEM"] = "product.combo.item";
740
+ LoadDataModel2["PRODUCT_PACKAGING"] = "product.packaging";
741
+ LoadDataModel2["PRODUCT_PRICELIST"] = "product.pricelist";
742
+ LoadDataModel2["PRODUCT_PRICELIST_ITEM"] = "product.pricelist.item";
743
+ LoadDataModel2["PRODUCT_PRODUCT"] = "product.product";
744
+ LoadDataModel2["PRODUCT_TAG"] = "product.tag";
745
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_LINE"] = "product.template.attribute.line";
746
+ LoadDataModel2["PRODUCT_TEMPLATE_ATTRIBUTE_VALUE"] = "product.template.attribute.value";
747
+ LoadDataModel2["RES_COMPANY"] = "res.company";
748
+ LoadDataModel2["RES_COUNTRY"] = "res.country";
749
+ LoadDataModel2["RES_COUNTRY_STATE"] = "res.country.state";
750
+ LoadDataModel2["RES_CURRENCY"] = "res.currency";
751
+ LoadDataModel2["RES_LANG"] = "res.lang";
752
+ LoadDataModel2["RES_PARTNER"] = "res.partner";
753
+ LoadDataModel2["RES_USERS"] = "res.users";
754
+ LoadDataModel2["STOCK_PICKING_TYPE"] = "stock.picking.type";
755
+ LoadDataModel2["UOM_CATEGORY"] = "uom.category";
756
+ LoadDataModel2["UOM_UOM"] = "uom.uom";
757
+ LoadDataModel2["LOYALTY_PROGRAM"] = "loyalty.program";
758
+ LoadDataModel2["LOYALTY_RULE"] = "loyalty.rule";
759
+ LoadDataModel2["RESTAURANT_TABLE"] = "restaurant.table";
760
+ LoadDataModel2["RESTAURANT_FLOOR"] = "restaurant.floor";
761
+ LoadDataModel2["POS_MAKE_PAYMENT"] = "pos.make.payment";
762
+ return LoadDataModel2;
763
+ })(LoadDataModel || {});
764
+
713
765
  // src/constants/widget/widget-avatar-constant.ts
714
766
  var WIDGETAVATAR = /* @__PURE__ */ ((WIDGETAVATAR2) => {
715
767
  WIDGETAVATAR2["many2one_avatar_user"] = "many2one_avatar_user";
@@ -2879,13 +2931,6 @@ function cleanObject(obj) {
2879
2931
  }
2880
2932
  return result;
2881
2933
  }
2882
- var extractIdFromDomain = (domain) => {
2883
- if (!domain || !Array.isArray(domain)) return null;
2884
- const idCond = domain.find(
2885
- ([field, operator]) => field === "id" && operator === "="
2886
- );
2887
- return idCond ? Number(idCond[2]) : null;
2888
- };
2889
2934
 
2890
2935
  // src/utils/storage/local-storage.ts
2891
2936
  var localStorageUtils = () => {
@@ -5168,544 +5213,7 @@ var getASessionService = (env) => {
5168
5213
 
5169
5214
  // src/services/pos-service/add-entity.ts
5170
5215
  import { useCallback as useCallback12 } from "react";
5171
-
5172
- // src/services/filesystem-service/file-service.ts
5173
- import { Directory, Encoding, Filesystem } from "@capacitor/filesystem";
5174
- var fileService = {
5175
- read: async (path) => {
5176
- try {
5177
- const res = await Filesystem.readFile({
5178
- path,
5179
- directory: Directory.Data,
5180
- encoding: Encoding.UTF8
5181
- });
5182
- if (typeof res.data === "string") return res.data;
5183
- if (res.data instanceof Blob) return await res.data.text();
5184
- return null;
5185
- } catch {
5186
- return null;
5187
- }
5188
- },
5189
- write: async (path, data) => {
5190
- await Filesystem.writeFile({
5191
- path,
5192
- data,
5193
- directory: Directory.Data,
5194
- encoding: Encoding.UTF8,
5195
- recursive: true
5196
- });
5197
- },
5198
- writeAtomic: async (path, data) => {
5199
- const tempPath = path + ".tmp";
5200
- await Filesystem.writeFile({
5201
- path: tempPath,
5202
- data,
5203
- directory: Directory.Data,
5204
- encoding: Encoding.UTF8,
5205
- recursive: true
5206
- });
5207
- try {
5208
- await Filesystem.deleteFile({
5209
- path,
5210
- directory: Directory.Data
5211
- });
5212
- } catch {
5213
- }
5214
- await Filesystem.rename({
5215
- from: tempPath,
5216
- to: path,
5217
- directory: Directory.Data
5218
- });
5219
- },
5220
- delete: async (path) => {
5221
- try {
5222
- await Filesystem.deleteFile({
5223
- path,
5224
- directory: Directory.Data
5225
- });
5226
- } catch {
5227
- }
5228
- },
5229
- exists: async (path) => {
5230
- try {
5231
- await Filesystem.stat({
5232
- path,
5233
- directory: Directory.Data
5234
- });
5235
- return true;
5236
- } catch {
5237
- return false;
5238
- }
5239
- },
5240
- mkdir: async (path) => {
5241
- try {
5242
- await Filesystem.mkdir({
5243
- path,
5244
- directory: Directory.Data,
5245
- recursive: true
5246
- });
5247
- } catch (e) {
5248
- if (!String(e?.message).includes("Exists")) {
5249
- throw e;
5250
- }
5251
- }
5252
- },
5253
- list: async (path) => {
5254
- return Filesystem.readdir({
5255
- path,
5256
- directory: Directory.Data
5257
- });
5258
- },
5259
- getUri: async (path) => {
5260
- return Filesystem.getUri({
5261
- path,
5262
- directory: Directory.Data
5263
- });
5264
- }
5265
- };
5266
-
5267
- // src/services/filesystem-service/json-worker.ts
5268
- function createWorkerBlob() {
5269
- const workerCode = `
5270
- self.addEventListener("message", async (ev) => {
5271
- const { id, cmd, payload } = ev.data;
5272
- try {
5273
- if (cmd === "parse") {
5274
- const parsed = JSON.parse(payload);
5275
- self.postMessage({ id, ok: true, result: parsed });
5276
- } else if (cmd === "stringify") {
5277
- const str = JSON.stringify(payload);
5278
- self.postMessage({ id, ok: true, result: str });
5279
- }
5280
- } catch (err) {
5281
- self.postMessage({ id, ok: false, error: err?.message || String(err) });
5282
- }
5283
- });
5284
- `;
5285
- const blob = new Blob([workerCode], { type: "application/javascript" });
5286
- return URL.createObjectURL(blob);
5287
- }
5288
- function spawnParseWorker(raw) {
5289
- return new Promise((resolve, reject) => {
5290
- const workerUrl = createWorkerBlob();
5291
- const worker = new Worker(workerUrl);
5292
- const id = Math.random().toString(36).slice(2);
5293
- worker.onmessage = (ev) => {
5294
- const { ok, result, error } = ev.data;
5295
- if (ok) {
5296
- resolve(result);
5297
- } else {
5298
- reject(new Error(error));
5299
- }
5300
- URL.revokeObjectURL(workerUrl);
5301
- worker.terminate();
5302
- };
5303
- worker.onerror = (err) => {
5304
- reject(err);
5305
- URL.revokeObjectURL(workerUrl);
5306
- worker.terminate();
5307
- };
5308
- worker.postMessage({ id, cmd: "parse", payload: raw });
5309
- });
5310
- }
5311
- function spawnStringifyWorker(obj) {
5312
- return new Promise((resolve, reject) => {
5313
- const workerUrl = createWorkerBlob();
5314
- const worker = new Worker(workerUrl);
5315
- worker.onmessage = (ev) => {
5316
- const { ok, result, error } = ev.data;
5317
- if (ok) resolve(result);
5318
- else reject(new Error(error));
5319
- URL.revokeObjectURL(workerUrl);
5320
- worker.terminate();
5321
- };
5322
- worker.onerror = (err) => {
5323
- reject(err);
5324
- URL.revokeObjectURL(workerUrl);
5325
- worker.terminate();
5326
- };
5327
- worker.postMessage({ cmd: "stringify", payload: obj });
5328
- });
5329
- }
5330
-
5331
- // src/services/filesystem-service/manifest.ts
5332
- var MANIFEST_PATH = "pos/manifest.json";
5333
- var MANIFEST_BAK_PATH = "pos/manifest.bak.json";
5334
- async function writeManifest(manifest) {
5335
- const oldRaw = await fileService.read(MANIFEST_PATH);
5336
- if (oldRaw !== null) {
5337
- await fileService.writeAtomic(MANIFEST_BAK_PATH, oldRaw);
5338
- }
5339
- await fileService.writeAtomic(MANIFEST_PATH, JSON.stringify(manifest));
5340
- try {
5341
- await fileService.delete(MANIFEST_BAK_PATH);
5342
- } catch {
5343
- }
5344
- }
5345
-
5346
- // src/services/filesystem-service/import-snapshot.ts
5347
- var DATA_DIR = "pos";
5348
- var MODELS_DIR = `${DATA_DIR}/models`;
5349
- var MODELS_META_DIR = `${DATA_DIR}/models_meta`;
5350
- var importSnapshot = async ({ data, onProgress }) => {
5351
- onProgress?.(1, "Parsing snapshot");
5352
- const parsed = await spawnParseWorker(data);
5353
- const modelNames = Object.keys(parsed);
5354
- const total = modelNames.length;
5355
- const manifest = { version: (/* @__PURE__ */ new Date()).toISOString(), models: {} };
5356
- const TMP_PREFIX = `pos/data/tmp_import_${Date.now()}`;
5357
- await fileService.writeAtomic(`${TMP_PREFIX}/.marker`, "1");
5358
- let i = 0;
5359
- for (const model of modelNames) {
5360
- i++;
5361
- onProgress?.(
5362
- Math.round(i / total * 100),
5363
- `Processing ${model} (${i}/${total})`
5364
- );
5365
- const block = parsed[model];
5366
- const dataPart = block?.data ?? block ?? [];
5367
- const fields = block?.fields ?? [];
5368
- const relations = block?.relations ?? {};
5369
- const serialized = await spawnStringifyWorker(dataPart);
5370
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5371
- await fileService.writeAtomic(tmpModelPath, serialized);
5372
- const meta = {
5373
- fields,
5374
- relations,
5375
- count: Array.isArray(dataPart) ? dataPart.length : 0,
5376
- writtenAt: (/* @__PURE__ */ new Date()).toISOString()
5377
- };
5378
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5379
- await fileService.writeAtomic(tmpMetaPath, JSON.stringify(meta));
5380
- manifest.models[model] = {
5381
- file: `${MODELS_DIR}/${encodeURIComponent(model)}.json`,
5382
- metaFile: `${MODELS_META_DIR}/${encodeURIComponent(model)}.meta.json`,
5383
- count: meta.count,
5384
- updatedAt: meta.writtenAt
5385
- };
5386
- }
5387
- onProgress?.(95, "Committing import (moving files)");
5388
- for (const model of modelNames) {
5389
- const tmpModelPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.json`;
5390
- const finalModelPath = `${MODELS_DIR}/${encodeURIComponent(model)}.json`;
5391
- const tmpMetaPath = `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`;
5392
- const finalMetaPath = `${MODELS_META_DIR}/${encodeURIComponent(
5393
- model
5394
- )}.meta.json`;
5395
- const tmpRaw = await fileService.read(tmpModelPath);
5396
- if (tmpRaw !== null) await fileService.writeAtomic(finalModelPath, tmpRaw);
5397
- const tmpMetaRaw = await fileService.read(tmpMetaPath);
5398
- if (tmpMetaRaw !== null)
5399
- await fileService.writeAtomic(finalMetaPath, tmpMetaRaw);
5400
- onProgress?.(
5401
- 95 + Math.round(
5402
- (Object.keys(manifest.models).indexOf(model) + 1) / modelNames.length * 5
5403
- ),
5404
- `Committed ${model}`
5405
- );
5406
- }
5407
- await writeManifest(manifest);
5408
- try {
5409
- for (const model of modelNames) {
5410
- await fileService.delete(
5411
- `${TMP_PREFIX}/${encodeURIComponent(model)}.json`
5412
- );
5413
- await fileService.delete(
5414
- `${TMP_PREFIX}/${encodeURIComponent(model)}.meta.json`
5415
- );
5416
- }
5417
- await fileService.delete(`${TMP_PREFIX}/.marker`);
5418
- } catch (e) {
5419
- console.log("Failed to cleanup tmp import files:", e);
5420
- }
5421
- onProgress?.(100, "Import complete");
5422
- return manifest;
5423
- };
5424
- var import_snapshot_default = importSnapshot;
5425
-
5426
- // src/services/filesystem-service/memory-cache.ts
5427
- var MemoryCache = class {
5428
- map = /* @__PURE__ */ new Map();
5429
- get(k) {
5430
- const e = this.map.get(k);
5431
- if (!e) return null;
5432
- if (e.ttl && Date.now() - e.t > e.ttl) {
5433
- this.map.delete(k);
5434
- return null;
5435
- }
5436
- return e.value;
5437
- }
5438
- set(k, v, ttl = 5 * 60 * 1e3) {
5439
- this.map.set(k, { value: v, t: Date.now(), ttl });
5440
- }
5441
- del(k) {
5442
- this.map.delete(k);
5443
- }
5444
- clear() {
5445
- this.map.clear();
5446
- }
5447
- };
5448
- var memoryCache = new MemoryCache();
5449
-
5450
- // src/services/filesystem-service/model-loader.ts
5451
- var MODELS_DIR2 = "pos/models";
5452
- var MODELS_META_DIR2 = "pos/models_meta";
5453
- async function loadModelData(modelName, includeMeta = true) {
5454
- const key = `model:${modelName}:meta:${includeMeta}`;
5455
- const cached = memoryCache.get(key);
5456
- if (cached) return cached;
5457
- const dataPath = `${MODELS_DIR2}/${encodeURIComponent(modelName)}.json`;
5458
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5459
- modelName
5460
- )}.meta.json`;
5461
- const rawData = await fileService.read(dataPath);
5462
- if (!rawData) return null;
5463
- const parsedData = await spawnParseWorker(rawData);
5464
- const data = Array.isArray(parsedData) ? parsedData : [];
5465
- if (!includeMeta) {
5466
- const result2 = { data };
5467
- memoryCache.set(key, result2, 1e3 * 60 * 60);
5468
- return result2;
5469
- }
5470
- const rawMeta = await fileService.read(metaPath);
5471
- let fields = [];
5472
- let relations = {};
5473
- if (rawMeta) {
5474
- const parsedMeta = await spawnParseWorker(rawMeta);
5475
- fields = parsedMeta?.fields ?? [];
5476
- relations = parsedMeta?.relations ?? {};
5477
- }
5478
- const result = {
5479
- data,
5480
- fields,
5481
- relations
5482
- };
5483
- memoryCache.set(key, result, 1e3 * 60 * 60);
5484
- return result;
5485
- }
5486
- async function loadData(includeMeta = true) {
5487
- try {
5488
- const listResult = await fileService.list(MODELS_DIR2);
5489
- if (!listResult || !Array.isArray(listResult.files)) {
5490
- console.log("No models found");
5491
- return {};
5492
- }
5493
- const result = {};
5494
- for (const file of listResult.files) {
5495
- if (file.type !== "file") continue;
5496
- if (!file.name.endsWith(".json")) continue;
5497
- const fileName = file.name;
5498
- const modelName = fileName.replace(/\.json$/, "");
5499
- const dataPath = `${MODELS_DIR2}/${fileName}`;
5500
- const rawData = await fileService.read(dataPath);
5501
- if (!rawData) continue;
5502
- const parsedData = await spawnParseWorker(rawData);
5503
- const data = Array.isArray(parsedData) ? parsedData : [];
5504
- if (!includeMeta) {
5505
- result[modelName] = { data };
5506
- continue;
5507
- }
5508
- const metaPath = `${MODELS_META_DIR2}/${encodeURIComponent(
5509
- modelName
5510
- )}.meta.json`;
5511
- const rawMeta = await fileService.read(metaPath);
5512
- let fields = [];
5513
- let relations = {};
5514
- if (rawMeta) {
5515
- const parsedMeta = await spawnParseWorker(rawMeta);
5516
- fields = parsedMeta?.fields ?? [];
5517
- relations = parsedMeta?.relations ?? {};
5518
- }
5519
- result[modelName] = {
5520
- data,
5521
- fields,
5522
- relations
5523
- };
5524
- }
5525
- return result;
5526
- } catch (error) {
5527
- console.error("Error loading data:", error);
5528
- throw error;
5529
- }
5530
- }
5531
-
5532
- // src/services/filesystem-service/snapshot-helper.ts
5533
- var createEmptySnapshot = () => {
5534
- return {
5535
- data: []
5536
- };
5537
- };
5538
- var generateNextId = (existingIds, startFrom = 1) => {
5539
- if (!existingIds || existingIds.length === 0) {
5540
- return startFrom;
5541
- }
5542
- const maxId = Math.max(...existingIds, startFrom - 1);
5543
- return maxId + 1;
5544
- };
5545
- var loadSnapshot = async ({
5546
- modelName
5547
- }) => {
5548
- try {
5549
- const snapshot = await loadModelData(modelName);
5550
- if (!snapshot || typeof snapshot !== "object") {
5551
- console.warn("invalid snapshot, creating new one");
5552
- return createEmptySnapshot();
5553
- }
5554
- return {
5555
- data: Array.isArray(snapshot.data) ? snapshot.data : []
5556
- };
5557
- } catch (error) {
5558
- console.error("Failed to load snapshot:", error);
5559
- return createEmptySnapshot();
5560
- }
5561
- };
5562
- var getExistingIds = (snapshot) => {
5563
- return snapshot.data.map((order) => order.id).filter((id) => typeof id === "number");
5564
- };
5565
- var saveSnapshot = async ({
5566
- snapshot,
5567
- modelName
5568
- }) => {
5569
- try {
5570
- await import_snapshot_default({
5571
- data: JSON.stringify({
5572
- [modelName]: snapshot
5573
- })
5574
- });
5575
- return true;
5576
- } catch (error) {
5577
- console.error("failed to save snapshot:", error);
5578
- return false;
5579
- }
5580
- };
5581
- var addRecordResponseHandler = ({
5582
- modelName,
5583
- id,
5584
- data
5585
- }) => {
5586
- if (modelName === "restaurant.floor" /* RESTAURANT_FLOOR */ || modelName === "res.partner" /* RES_PARTNER */) {
5587
- return [[id, ""]];
5588
- }
5589
- return data;
5590
- };
5591
-
5592
- // src/services/filesystem-service/model-repository.ts
5593
- var ModelRepository = class {
5594
- getAll = async ({ modelName }) => {
5595
- try {
5596
- const snapshot = await loadSnapshot({
5597
- modelName
5598
- });
5599
- return snapshot.data;
5600
- } catch (error) {
5601
- console.error("failed to get all records:", error);
5602
- return [];
5603
- }
5604
- };
5605
- getRecord = async ({
5606
- id,
5607
- modelName
5608
- }) => {
5609
- try {
5610
- const snapshot = await loadSnapshot({
5611
- modelName
5612
- });
5613
- return snapshot.data.find((record) => record.id === id) || null;
5614
- } catch (error) {
5615
- console.error("failed to get record:", error);
5616
- return null;
5617
- }
5618
- };
5619
- addRecord = async ({
5620
- newRecord,
5621
- modelName
5622
- }) => {
5623
- try {
5624
- const snapshot = await loadSnapshot({
5625
- modelName
5626
- });
5627
- const existingIds = getExistingIds(snapshot);
5628
- const newId = generateNextId(existingIds, snapshot.data.length);
5629
- snapshot.data.push({
5630
- ...newRecord,
5631
- id: newId
5632
- });
5633
- const saved = await saveSnapshot({
5634
- snapshot,
5635
- modelName
5636
- });
5637
- if (!saved) {
5638
- console.error("failed to add new record");
5639
- return [];
5640
- }
5641
- console.log("lib data:", snapshot.data);
5642
- const response = addRecordResponseHandler({
5643
- id: newId,
5644
- modelName,
5645
- data: snapshot.data
5646
- });
5647
- return response;
5648
- } catch (error) {
5649
- console.error("failed to add new record:", error);
5650
- return [];
5651
- }
5652
- };
5653
- updateRecord = async ({
5654
- id,
5655
- update,
5656
- modelName
5657
- }) => {
5658
- try {
5659
- const snapshot = await loadSnapshot({
5660
- modelName
5661
- });
5662
- const index = snapshot.data.findIndex((record) => record.id === id);
5663
- if (index === -1) {
5664
- console.error(`record with id ${id} not found`);
5665
- return false;
5666
- }
5667
- snapshot.data[index] = {
5668
- ...snapshot.data[index],
5669
- ...update
5670
- };
5671
- return await saveSnapshot({
5672
- snapshot,
5673
- modelName
5674
- });
5675
- } catch (error) {
5676
- console.error("error updating record:", error);
5677
- return false;
5678
- }
5679
- };
5680
- deleteRecord = async ({
5681
- id,
5682
- modelName
5683
- }) => {
5684
- try {
5685
- const snapshot = await loadSnapshot({
5686
- modelName
5687
- });
5688
- const before = snapshot.data.length;
5689
- snapshot.data = snapshot.data.filter((record) => record.id !== id);
5690
- if (snapshot.data.length === before) {
5691
- console.error(`record with id ${id} not found`);
5692
- return false;
5693
- }
5694
- return await saveSnapshot({
5695
- snapshot,
5696
- modelName
5697
- });
5698
- } catch (error) {
5699
- console.error("error deleting record:", error);
5700
- return false;
5701
- }
5702
- };
5703
- };
5704
-
5705
- // src/services/pos-service/add-entity.ts
5706
5216
  var addEntityService = (env) => {
5707
- const isLocalMode = env?.isLocalMode;
5708
- const repo = new ModelRepository();
5709
5217
  const addEntity = useCallback12(
5710
5218
  ({
5711
5219
  model,
@@ -5714,12 +5222,6 @@ var addEntityService = (env) => {
5714
5222
  service,
5715
5223
  isCreateEndpoint = false
5716
5224
  }) => {
5717
- if (isLocalMode) {
5718
- return repo.addRecord({
5719
- newRecord: values,
5720
- modelName: model
5721
- });
5722
- }
5723
5225
  const jsonData = {
5724
5226
  model,
5725
5227
  values
@@ -5736,7 +5238,7 @@ var addEntityService = (env) => {
5736
5238
  service
5737
5239
  );
5738
5240
  },
5739
- [env, isLocalMode]
5241
+ [env]
5740
5242
  );
5741
5243
  return {
5742
5244
  addEntity
@@ -5858,8 +5360,6 @@ var createEInvoiceService = (env) => {
5858
5360
  // src/services/pos-service/create-entity.ts
5859
5361
  import { useCallback as useCallback16 } from "react";
5860
5362
  var createEntityService = (env) => {
5861
- const isLocalMode = env?.isLocalMode;
5862
- const repo = new ModelRepository();
5863
5363
  const createEntity = useCallback16(
5864
5364
  ({
5865
5365
  model,
@@ -5867,12 +5367,6 @@ var createEntityService = (env) => {
5867
5367
  xNode,
5868
5368
  service
5869
5369
  }) => {
5870
- if (isLocalMode) {
5871
- return repo.addRecord({
5872
- newRecord: args[0],
5873
- modelName: model
5874
- });
5875
- }
5876
5370
  const jsonData = {
5877
5371
  model,
5878
5372
  method: "create" /* CREATE */,
@@ -5890,7 +5384,7 @@ var createEntityService = (env) => {
5890
5384
  service
5891
5385
  );
5892
5386
  },
5893
- [env, isLocalMode]
5387
+ [env]
5894
5388
  );
5895
5389
  return {
5896
5390
  createEntity
@@ -5975,8 +5469,6 @@ var createSessionService = (env) => {
5975
5469
  // src/services/pos-service/delete-entity.ts
5976
5470
  import { useCallback as useCallback19 } from "react";
5977
5471
  var deleteEntityService = (env) => {
5978
- const isLocalMode = env?.isLocalMode;
5979
- const repo = new ModelRepository();
5980
5472
  const deleteEntity = useCallback19(
5981
5473
  ({
5982
5474
  model,
@@ -5985,14 +5477,6 @@ var deleteEntityService = (env) => {
5985
5477
  service,
5986
5478
  method
5987
5479
  }) => {
5988
- if (isLocalMode) {
5989
- const id = ids[0];
5990
- if (!id) return;
5991
- return repo.deleteRecord({
5992
- modelName: model,
5993
- id
5994
- });
5995
- }
5996
5480
  const jsonData = {
5997
5481
  model,
5998
5482
  ids,
@@ -6010,7 +5494,7 @@ var deleteEntityService = (env) => {
6010
5494
  service
6011
5495
  );
6012
5496
  },
6013
- [env, isLocalMode]
5497
+ [env]
6014
5498
  );
6015
5499
  return {
6016
5500
  deleteEntity
@@ -6087,8 +5571,6 @@ var getCurrentUserService = (env) => {
6087
5571
  // src/services/pos-service/get-list.ts
6088
5572
  import { useCallback as useCallback22 } from "react";
6089
5573
  var getListService = (env) => {
6090
- const isLocalMode = env?.isLocalMode;
6091
- const repo = new ModelRepository();
6092
5574
  const getList = useCallback22(
6093
5575
  async ({
6094
5576
  model,
@@ -6099,12 +5581,6 @@ var getListService = (env) => {
6099
5581
  offset,
6100
5582
  limit
6101
5583
  }) => {
6102
- if (isLocalMode) {
6103
- const data = await repo.getAll({
6104
- modelName: model
6105
- });
6106
- return data;
6107
- }
6108
5584
  const jsonData = {
6109
5585
  model,
6110
5586
  method: "web_search_read" /* WEB_SEARCH_READ */,
@@ -6127,7 +5603,7 @@ var getListService = (env) => {
6127
5603
  service
6128
5604
  );
6129
5605
  },
6130
- [env, isLocalMode]
5606
+ [env]
6131
5607
  );
6132
5608
  return {
6133
5609
  getList
@@ -6456,8 +5932,55 @@ var handleClosingSessionService = (env) => {
6456
5932
 
6457
5933
  // src/services/pos-service/load-data-pos-session.ts
6458
5934
  import { useCallback as useCallback31 } from "react";
5935
+
5936
+ // src/provider/supabase-provider.tsx
5937
+ import { createContext, useContext, useMemo } from "react";
5938
+ import { createClient } from "@supabase/supabase-js";
5939
+ import { jsx as jsx4 } from "react/jsx-runtime";
5940
+ var SupabaseContext = createContext(null);
5941
+ var SupabaseProvider = ({
5942
+ supabaseUrl,
5943
+ supabaseKey,
5944
+ children
5945
+ }) => {
5946
+ const supabase = useMemo(() => {
5947
+ if (!supabaseUrl || !supabaseKey) return null;
5948
+ return createClient(supabaseUrl, supabaseKey);
5949
+ }, [supabaseUrl, supabaseKey]);
5950
+ return /* @__PURE__ */ jsx4(SupabaseContext.Provider, { value: supabase, children });
5951
+ };
5952
+ var useSupabase = () => {
5953
+ const context = useContext(SupabaseContext);
5954
+ if (!context) {
5955
+ throw new Error(
5956
+ "useSupabase must be used within a SupabaseProvider or check your env config"
5957
+ );
5958
+ }
5959
+ return context;
5960
+ };
5961
+ var useSupabaseOptional = () => {
5962
+ return useContext(SupabaseContext);
5963
+ };
5964
+
5965
+ // src/services/pos-service/load-data-pos-session.ts
5966
+ var MODEL_TO_TABLE = {
5967
+ ["account.tax" /* ACCOUNT_TAX */]: "account_taxes",
5968
+ ["res.company" /* RES_COMPANY */]: "companies",
5969
+ ["res.partner" /* RES_PARTNER */]: "customers",
5970
+ ["res.users" /* RES_USERS */]: "employees",
5971
+ ["loyalty.program" /* LOYALTY_PROGRAM */]: "loyalty_programs",
5972
+ ["loyalty.rule" /* LOYALTY_RULE */]: "loyalty_rules",
5973
+ ["pos.order.line" /* POS_ORDER_LINE */]: "order_lines",
5974
+ ["pos.order" /* POS_ORDER */]: "orders",
5975
+ ["pos.payment.method" /* POS_PAYMENT_METHOD */]: "payment_methods",
5976
+ ["pos.payment" /* POS_PAYMENT */]: "payments",
5977
+ ["product.category" /* PRODUCT_CATEGORY */]: "product_categories",
5978
+ ["product.product" /* PRODUCT_PRODUCT */]: "products",
5979
+ ["restaurant.floor" /* RESTAURANT_FLOOR */]: "restaurant_floors",
5980
+ ["restaurant.table" /* RESTAURANT_TABLE */]: "restaurant_tables"
5981
+ };
6459
5982
  var loadDataPosSessionService = (env) => {
6460
- const isLocalMode = env?.isLocalMode;
5983
+ const supabase = useSupabaseOptional();
6461
5984
  const loadDataPosSession = useCallback31(
6462
5985
  async ({
6463
5986
  model,
@@ -6468,10 +5991,6 @@ var loadDataPosSessionService = (env) => {
6468
5991
  modelsToLoad = [],
6469
5992
  searchParams
6470
5993
  }) => {
6471
- if (isLocalMode) {
6472
- const data = await loadData();
6473
- return data;
6474
- }
6475
5994
  const jsonData = {
6476
5995
  model,
6477
5996
  method: "load_data" /* LOAD_DATA */,
@@ -6498,10 +6017,67 @@ var loadDataPosSessionService = (env) => {
6498
6017
  service
6499
6018
  );
6500
6019
  },
6501
- [env, isLocalMode]
6020
+ [env]
6502
6021
  );
6022
+ const loadDataPosSessionSupabase = useCallback31(async () => {
6023
+ try {
6024
+ const allModels = Object.values(LoadDataModel);
6025
+ const promises = allModels.map(async (modelName) => {
6026
+ const tableName = MODEL_TO_TABLE[modelName];
6027
+ if (!tableName) {
6028
+ return {
6029
+ modelName,
6030
+ data: [],
6031
+ fields: {},
6032
+ relations: {}
6033
+ };
6034
+ }
6035
+ if (!supabase) {
6036
+ return {
6037
+ modelName,
6038
+ data: [],
6039
+ fields: {},
6040
+ relations: {}
6041
+ };
6042
+ }
6043
+ const { data, error } = await supabase.from(tableName).select("*");
6044
+ if (error) {
6045
+ console.error(`Error loading ${modelName}:`, error);
6046
+ return {
6047
+ modelName,
6048
+ data: [],
6049
+ fields: {},
6050
+ relations: {}
6051
+ };
6052
+ }
6053
+ return {
6054
+ modelName,
6055
+ data: data || [],
6056
+ fields: {},
6057
+ relations: {}
6058
+ };
6059
+ });
6060
+ const results = await Promise.all(promises);
6061
+ const response = results.reduce(
6062
+ (acc, { modelName, data, fields, relations }) => {
6063
+ acc[modelName] = {
6064
+ data,
6065
+ fields,
6066
+ relations
6067
+ };
6068
+ return acc;
6069
+ },
6070
+ {}
6071
+ );
6072
+ return response;
6073
+ } catch (error) {
6074
+ console.error("Error loading data from Supabase:", error);
6075
+ return {};
6076
+ }
6077
+ }, [supabase]);
6503
6078
  return {
6504
- loadDataPosSession
6079
+ loadDataPosSession,
6080
+ loadDataPosSessionSupabase
6505
6081
  };
6506
6082
  };
6507
6083
 
@@ -6723,8 +6299,6 @@ var updateClosedSessionService = (env) => {
6723
6299
  // src/services/pos-service/update-entity.ts
6724
6300
  import { useCallback as useCallback38 } from "react";
6725
6301
  var updateEntityService = (env) => {
6726
- const isLocalMode = env?.isLocalMode;
6727
- const repo = new ModelRepository();
6728
6302
  const updateEntity = useCallback38(
6729
6303
  ({
6730
6304
  model,
@@ -6734,15 +6308,6 @@ var updateEntityService = (env) => {
6734
6308
  xNode,
6735
6309
  service
6736
6310
  }) => {
6737
- if (isLocalMode) {
6738
- const id = extractIdFromDomain(domain);
6739
- if (!id) return;
6740
- return repo.updateRecord({
6741
- update: values,
6742
- modelName: model,
6743
- id
6744
- });
6745
- }
6746
6311
  const jsonData = {
6747
6312
  model,
6748
6313
  domain,
@@ -6760,7 +6325,7 @@ var updateEntityService = (env) => {
6760
6325
  service
6761
6326
  );
6762
6327
  },
6763
- [env, isLocalMode]
6328
+ [env]
6764
6329
  );
6765
6330
  return {
6766
6331
  updateEntity
@@ -6886,52 +6451,8 @@ var usePosService = () => {
6886
6451
  return service;
6887
6452
  };
6888
6453
 
6889
- // src/services/filesystem-service/init-snapshot.ts
6890
- var isSnapshotReady = async () => {
6891
- try {
6892
- const raw = await fileService.read("pos/manifest.json");
6893
- if (!raw) return false;
6894
- const manifest = JSON.parse(raw);
6895
- if (!manifest.models || typeof manifest.models !== "object") {
6896
- return false;
6897
- }
6898
- const modelEntries = Object.values(manifest.models);
6899
- if (modelEntries.length === 0) return false;
6900
- const firstModel = modelEntries[0];
6901
- if (!firstModel.file) return false;
6902
- const modelExists = await fileService.exists(firstModel.file);
6903
- return modelExists;
6904
- } catch {
6905
- return false;
6906
- }
6907
- };
6908
- async function initSnapshot(onProgress) {
6909
- const ready = await isSnapshotReady();
6910
- if (ready) {
6911
- console.log("skip initialization.");
6912
- return;
6913
- }
6914
- console.log("initializing from data.json...");
6915
- const jsonData = await fetch("/data.json").then((r) => r.text());
6916
- if (!jsonData) {
6917
- console.error("cannot load data.json");
6918
- return;
6919
- }
6920
- await import_snapshot_default({
6921
- data: jsonData,
6922
- onProgress
6923
- });
6924
- }
6925
-
6926
- // src/services/filesystem-service/index.ts
6927
- var useFileSystemService = () => {
6928
- return {
6929
- initSnapshot
6930
- };
6931
- };
6932
-
6933
6454
  // src/provider/version-gate-provider.tsx
6934
- import { Fragment, jsx as jsx4 } from "react/jsx-runtime";
6455
+ import { Fragment, jsx as jsx5 } from "react/jsx-runtime";
6935
6456
  var VersionGate = ({ children }) => {
6936
6457
  const queryClient = useQueryClient();
6937
6458
  const [ready, setReady] = useState3(false);
@@ -6963,11 +6484,11 @@ var VersionGate = ({ children }) => {
6963
6484
  return () => window.removeEventListener("keydown", onKey);
6964
6485
  }
6965
6486
  }, [queryClient]);
6966
- return ready ? /* @__PURE__ */ jsx4(Fragment, { children }) : null;
6487
+ return ready ? /* @__PURE__ */ jsx5(Fragment, { children }) : null;
6967
6488
  };
6968
6489
 
6969
6490
  // src/provider/env-provider.tsx
6970
- import { createContext, useContext, useState as useState4, useCallback as useCallback41 } from "react";
6491
+ import { createContext as createContext2, useContext as useContext2, useState as useState4, useCallback as useCallback41 } from "react";
6971
6492
 
6972
6493
  // src/configs/axios-client.ts
6973
6494
  import axios from "axios";
@@ -7296,7 +6817,7 @@ var axiosClient = {
7296
6817
  };
7297
6818
 
7298
6819
  // src/provider/env-provider.tsx
7299
- import { jsx as jsx5 } from "react/jsx-runtime";
6820
+ import { jsx as jsx6 } from "react/jsx-runtime";
7300
6821
  var initialEnvState = {
7301
6822
  env: null,
7302
6823
  baseUrl: "",
@@ -7318,9 +6839,9 @@ var initialEnvState = {
7318
6839
  tz: "Asia/Saigon"
7319
6840
  },
7320
6841
  excludeLanguages: [],
7321
- isLocalMode: false
6842
+ isSupaMode: false
7322
6843
  };
7323
- var EnvContext = createContext(null);
6844
+ var EnvContext = createContext2(null);
7324
6845
  function EnvProvider({
7325
6846
  children,
7326
6847
  localStorageUtils: localStorageUtil = localStorageUtils(),
@@ -7396,7 +6917,7 @@ function EnvProvider({
7396
6917
  envFile
7397
6918
  }));
7398
6919
  }, []);
7399
- return /* @__PURE__ */ jsx5(
6920
+ return /* @__PURE__ */ jsx6(
7400
6921
  EnvContext.Provider,
7401
6922
  {
7402
6923
  value: {
@@ -7416,7 +6937,7 @@ function EnvProvider({
7416
6937
  );
7417
6938
  }
7418
6939
  function useEnv() {
7419
- const context = useContext(EnvContext);
6940
+ const context = useContext2(EnvContext);
7420
6941
  if (!context) {
7421
6942
  throw new Error("useEnv must be used within an EnvProvider");
7422
6943
  }
@@ -7424,7 +6945,7 @@ function useEnv() {
7424
6945
  }
7425
6946
 
7426
6947
  // src/provider/service-provider.tsx
7427
- import { createContext as createContext2, useContext as useContext2 } from "react";
6948
+ import { createContext as createContext3, useContext as useContext3 } from "react";
7428
6949
 
7429
6950
  // src/hooks/auth/use-forgot-password.ts
7430
6951
  import { useMutation } from "@tanstack/react-query";
@@ -9315,8 +8836,9 @@ var use_handle_closing_session_default = useHandleClosingSession;
9315
8836
  import { useMutation as useMutation77 } from "@tanstack/react-query";
9316
8837
  var useLoadDataPosSession = () => {
9317
8838
  const pos = usePosService();
8839
+ const { env } = useEnv();
9318
8840
  return useMutation77({
9319
- mutationFn: pos.loadDataPosSession
8841
+ mutationFn: env.isSupaMode ? pos.loadDataPosSessionSupabase : pos.loadDataPosSession
9320
8842
  });
9321
8843
  };
9322
8844
  var use_load_data_pos_session_default = useLoadDataPosSession;
@@ -9401,29 +8923,19 @@ var useUpdateOrderStatus = () => {
9401
8923
  };
9402
8924
  var use_update_order_status_default = useUpdateOrderStatus;
9403
8925
 
9404
- // src/hooks/pos/use-init-snapshot.ts
9405
- import { useMutation as useMutation86 } from "@tanstack/react-query";
9406
- var useInitSnapshot = () => {
9407
- const fileSystem = useFileSystemService();
9408
- return useMutation86({
9409
- mutationFn: fileSystem.initSnapshot
9410
- });
9411
- };
9412
- var use_init_snapshot_default = useInitSnapshot;
9413
-
9414
8926
  // src/hooks/pos/use-complete-current-stage.ts
9415
- import { useMutation as useMutation87 } from "@tanstack/react-query";
8927
+ import { useMutation as useMutation86 } from "@tanstack/react-query";
9416
8928
  var useCompleteCurrentStage = () => {
9417
8929
  const pos = usePosService();
9418
- return useMutation87({
8930
+ return useMutation86({
9419
8931
  mutationFn: pos.completeCurrentStage
9420
8932
  });
9421
8933
  };
9422
8934
  var use_complete_current_stage_default = useCompleteCurrentStage;
9423
8935
 
9424
8936
  // src/provider/service-provider.tsx
9425
- import { jsx as jsx6 } from "react/jsx-runtime";
9426
- var ServiceContext = createContext2(null);
8937
+ import { jsx as jsx7 } from "react/jsx-runtime";
8938
+ var ServiceContext = createContext3(null);
9427
8939
  var ServiceProvider = ({
9428
8940
  children
9429
8941
  }) => {
@@ -9540,13 +9052,12 @@ var ServiceProvider = ({
9540
9052
  useGetWard: use_get_ward_default,
9541
9053
  useGetCountry: use_get_country_default,
9542
9054
  useGetPartnerTitle: use_get_partner_title_default,
9543
- useInitSnapshot: use_init_snapshot_default,
9544
9055
  useCompleteCurrentStage: use_complete_current_stage_default
9545
9056
  };
9546
- return /* @__PURE__ */ jsx6(ServiceContext.Provider, { value: services, children });
9057
+ return /* @__PURE__ */ jsx7(ServiceContext.Provider, { value: services, children });
9547
9058
  };
9548
9059
  var useService = () => {
9549
- const context = useContext2(ServiceContext);
9060
+ const context = useContext3(ServiceContext);
9550
9061
  if (!context) {
9551
9062
  throw new Error("useService must be used within a ServiceProvider");
9552
9063
  }
@@ -9555,7 +9066,7 @@ var useService = () => {
9555
9066
 
9556
9067
  // src/provider/meta-provider.tsx
9557
9068
  import { useEffect as useEffect3 } from "react";
9558
- import { Fragment as Fragment2, jsx as jsx7 } from "react/jsx-runtime";
9069
+ import { Fragment as Fragment2, jsx as jsx8 } from "react/jsx-runtime";
9559
9070
  var MetaProvider = ({ children }) => {
9560
9071
  const { env } = useEnv();
9561
9072
  function updateMetadata() {
@@ -9606,7 +9117,7 @@ var MetaProvider = ({ children }) => {
9606
9117
  useEffect3(() => {
9607
9118
  updateMetadata();
9608
9119
  }, [env?.defaultCompany]);
9609
- return /* @__PURE__ */ jsx7(Fragment2, { children });
9120
+ return /* @__PURE__ */ jsx8(Fragment2, { children });
9610
9121
  };
9611
9122
  export {
9612
9123
  EnvProvider,
@@ -9614,7 +9125,9 @@ export {
9614
9125
  MetaProvider,
9615
9126
  ReactQueryProvider,
9616
9127
  ServiceProvider,
9128
+ SupabaseProvider,
9617
9129
  VersionGate,
9618
9130
  useEnv,
9619
- useService
9131
+ useService,
9132
+ useSupabase
9620
9133
  };