/** * IndexedDB Wrapper for Offline Contabilidad * Stores pending transactions when offline */ const OfflineDB = { dbName: 'ContabilidadOfflineDB', version: 1, storeName: 'pendingTransactions', /** * Initialize the database */ async init() { return new Promise((resolve, reject) => { const request = indexedDB.open(this.dbName, this.version); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(request.result); request.onupgradeneeded = (event) => { const db = event.target.result; // Create object store if it doesn't exist if (!db.objectStoreNames.contains(this.storeName)) { const objectStore = db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true }); objectStore.createIndex('timestamp', 'timestamp', { unique: false }); objectStore.createIndex('reporteId', 'reporteId', { unique: false }); } }; }); }, /** * Add a pending transaction to the queue */ async addPending(reporteId, movimientos) { const db = await this.init(); return new Promise((resolve, reject) => { const transaction = db.transaction([this.storeName], 'readwrite'); const store = transaction.objectStore(this.storeName); const record = { reporteId: reporteId, movimientos: movimientos, timestamp: new Date().toISOString() }; const request = store.add(record); request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); }, /** * Get all pending transactions */ async getAllPending() { const db = await this.init(); return new Promise((resolve, reject) => { const transaction = db.transaction([this.storeName], 'readonly'); const store = transaction.objectStore(this.storeName); const request = store.getAll(); request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); }, /** * Remove a specific pending transaction by id */ async removePending(id) { const db = await this.init(); return new Promise((resolve, reject) => { const transaction = db.transaction([this.storeName], 'readwrite'); const store = transaction.objectStore(this.storeName); const request = store.delete(id); request.onsuccess = () => resolve(); request.onerror = () => reject(request.error); }); }, /** * Clear all pending transactions */ async clearPending() { const db = await this.init(); return new Promise((resolve, reject) => { const transaction = db.transaction([this.storeName], 'readwrite'); const store = transaction.objectStore(this.storeName); const request = store.clear(); request.onsuccess = () => resolve(); request.onerror = () => reject(request.error); }); }, /** * Get count of pending transactions */ async getPendingCount() { const db = await this.init(); return new Promise((resolve, reject) => { const transaction = db.transaction([this.storeName], 'readonly'); const store = transaction.objectStore(this.storeName); const request = store.count(); request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); }); } };