import assert from 'node:assert/strict'; import { mkdtempSync, rmSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import LibDashStore from '../src/index.js'; import { BetterSqlite3Provider } from '../src/providers/sqlite3/index.js'; async function run() { console.log('--- Testing Delivery Link Check & Sync in dashdbschema ---'); const tempDir = mkdtempSync(join(tmpdir(), 'test-delivery-link-check-')); const dbFile = join(tempDir, 'test.db'); const storageDir = join(tempDir, 'storage'); const provider = new BetterSqlite3Provider({ filename: dbFile, storageDir, }); await provider.initialize(); const store = await new LibDashStore(provider); try { const googleAuthId = await store.google_auth.add('link-check-test@example.com'); const company = await store.company.create({ name: 'Link Check Corp', iso639: 'de', taxrate: 19, reducedtaxrate: 7, googleAuthId, }); await store.google_auth.setSelectedCompany(googleAuthId, company.id); await store.warehouse.create(googleAuthId, { name: 'Hauptlager' }); const supplier = await store.supplier.create(googleAuthId, { name: 'eks', }); const art = await store.article.createUnderParent({ googleAuthId, parentId: company.rootCategoryId, name: 'Club Mate 0,5l', track_stock: 1, }); // Assign supplier with default pu=1, without EK await store.articlesupplier.create(googleAuthId, art.sku, { entityId: supplier.id, sku: 'mate', pu: 1, }); let asup = await store.articlesupplier.listByArticleSku(googleAuthId, art.sku); assert.equal(asup.length, 1); assert.equal(asup[0].pu, 1); assert.equal(asup[0].price, null); // Create delivery with manifest line: sku: 'mate', pu: 20, net: 12 const delivery = await store.delivery.create(googleAuthId, { date: '2026-10-25T10:00:00Z', externalNumber: 'LS-000001', supplierId: supplier.id, lines: [ { sku: 'mate', name: 'Club Mate 0,5l', pu: 20, amount: 2, net: 12, taxrate: 19 }, ], }); assert(delivery.id > 0); assert.equal(delivery.lines[0].pu, 20); // Verify articlesupplier link was updated! asup = await store.articlesupplier.listByArticleSku(googleAuthId, art.sku); assert.equal(asup.length, 1); assert.equal(asup[0].pu, 20, 'VPE in articlesupplier must be synced to 20'); assert.equal(asup[0].price.net, 12, 'Net price in articlesupplier must be synced to 12'); assert.equal(asup[0].price.taxRate, 19, 'Tax rate in articlesupplier must be synced to 19'); // Verify article history const history = await store.article.getHistoryBySku(googleAuthId, art.sku); const historyTexts = (Array.isArray(history) ? history : history.history).map((h) => h.text); console.log('Article history entries:', historyTexts); assert( historyTexts.some((t) => t.includes('Lieferant "eks" aktualisiert (VPE: 20, EK: € 12,00, MwSt.: 19%)')), 'Must record history entry for supplier update with VPE, EK, and MwSt' ); // Now update delivery with new line pu: 24, net: 11.50, and taxrate: 7 await store.delivery.update(googleAuthId, delivery.id, { lines: [ { sku: 'mate', name: 'Club Mate 0,5l', pu: 24, amount: 3, net: 11.5, taxrate: 7 }, ], }); asup = await store.articlesupplier.listByArticleSku(googleAuthId, art.sku); assert.equal(asup[0].pu, 24, 'VPE in articlesupplier must be synced to 24 on update'); assert.equal(asup[0].price.net, 11.5, 'Net price in articlesupplier must be synced to 11.5 on update'); assert.equal(asup[0].price.taxRate, 7, 'Tax rate in articlesupplier must be synced to 7 on update'); const historyAfterUpdate = await store.article.getHistoryBySku(googleAuthId, art.sku); const historyAfterTexts = (Array.isArray(historyAfterUpdate) ? historyAfterUpdate : historyAfterUpdate.history).map((h) => h.text); console.log('Article history entries after delivery update:', historyAfterTexts); assert( historyAfterTexts.some((t) => t.includes('Lieferant "eks" aktualisiert (VPE: 24, EK: € 11,50, MwSt.: 7%)')), 'Must record history entry for supplier update on delivery update' ); // Now test booking the delivery with amount: 3, pu: 24 // Should add 3 * 24 = 72 to stock and record clear history! await store.delivery.book(googleAuthId, delivery.id); const artDetail = await store.article.getBySku(googleAuthId, art.sku); const totalStock = (artDetail.article.warehouses || []).reduce((acc, w) => acc + (w.stock || 0), 0); console.log('Article stock after booking delivery with amount 3, pu 24:', totalStock); assert.equal(totalStock, 72, 'Physical warehouse stock must be amount * pu (3 * 24 = 72)'); const historyAfterBooking = await store.article.getHistoryBySku(googleAuthId, art.sku); const bookingTexts = (Array.isArray(historyAfterBooking) ? historyAfterBooking : historyAfterBooking.history).map((h) => h.text); console.log('Article history entries after delivery booking:', bookingTexts); assert( bookingTexts.some((t) => t.includes('Lager: "Hauptlager"') && t.includes('Menge: 72 (3 x VPE 24)')), 'Warehouse history must clearly show Menge: 72 (3 x VPE 24)' ); assert( bookingTexts.some((t) => t.includes('Lieferant: "eks"') && t.includes('Menge: 3, VPE: 24')), 'Acceptance history must clearly show Menge: 3, VPE: 24' ); console.log('✓ Delivery link check and sync passed successfully!'); } finally { try { provider.close(); rmSync(tempDir, { recursive: true, force: true }); } catch { // ignore cleanup errors } } } run().catch((err) => { console.error(err); process.exit(1); });