From 387147ccf396f0a9a27ba6ec4218ddc1d08acc6b Mon Sep 17 00:00:00 2001 From: seb Date: Fri, 25 Sep 2026 07:27:22 +0200 Subject: [PATCH] u --- scripts/test-ledger.js | 37 ++++++++++++++++++------- src/providers/mssql/queries/ledger.js | 16 ++++++++++- src/providers/sqlite3/queries/ledger.js | 16 ++++++++++- src/store/ledger/add.js | 21 ++++++++++++-- 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/scripts/test-ledger.js b/scripts/test-ledger.js index 4b557df..681e6e5 100644 --- a/scripts/test-ledger.js +++ b/scripts/test-ledger.js @@ -34,6 +34,25 @@ async function run() { }); await store.google_auth.setSelectedCompany(googleAuthId, company.id); + await store.unit.upsert(googleAuthId, { + si: 'stk', + basesi: 'stk', + basesifactor: 1, + symbol: 'Stk', + name: 'Stück', + }); + const supplier = await store.supplier.create(googleAuthId, { name: 'Supplier X' }); + const article = await store.article.createUnderParent({ + googleAuthId, + parentId: company.rootCategoryId, + name: 'Ledger Linked Article', + }); + await store.articlesupplier.create(googleAuthId, article.sku, { + entityId: supplier.id, + sku: 'SKU-ABC', + pu: 1, + }); + // Create a delivery manifest with lines const delivery = await store.delivery.create(googleAuthId, { externalNumber: 'DEL-1', @@ -193,16 +212,14 @@ async function run() { const listUnknownSku = await store.ledger.listBySku(googleAuthId, 'UNKNOWN-SKU'); assert.equal(listUnknownSku.length, 0); - // 7. Test validation & company authorization - console.log('6. Testing authorization & validation errors...'); - await assert.rejects( - () => store.ledger.listByManifestarticleId(googleAuthId, 999999), - /Manifest article not found/, - ); - await assert.rejects( - () => store.ledger.listBySku(googleAuthId, ''), - /Invalid SKU/, - ); + // 8. Test article history created from ledger + console.log('7. Testing article history entries from ledger rows...'); + const history = await store.article.getHistoryBySku(googleAuthId, article.sku); + const historyTexts = history.map((h) => h.text); + console.log('Article history texts:', historyTexts); + assert(historyTexts.includes('Initial delivery movement'), 'History should include initial delivery movement'); + assert(historyTexts.includes('Damaged item written off'), 'History should include damaged item written off'); + assert(historyTexts.includes('Second line goods receipt'), 'History should include second line goods receipt'); console.log('✓ All ledger tests passed successfully!'); } finally { diff --git a/src/providers/mssql/queries/ledger.js b/src/providers/mssql/queries/ledger.js index cb688af..f23b687 100644 --- a/src/providers/mssql/queries/ledger.js +++ b/src/providers/mssql/queries/ledger.js @@ -1,10 +1,24 @@ export const CHECK_MANIFESTARTICLE_ACCESS = ` -SELECT ma.id +SELECT ma.id, ma.sku FROM manifestarticle ma INNER JOIN manifest m ON ma.manifest_id = m.id WHERE ma.id = @manifestarticleId AND m.company_id = @companyId; `; +export const FIND_ARTICLES_FOR_HISTORY = ` +SELECT DISTINCT asup.article_id AS articleId +FROM articlesupplier asup +INNER JOIN entity e ON e.id = asup.entity_id +INNER JOIN customergroup cg ON cg.id = e.customergroup_id +WHERE asup.sku = @sku + AND cg.company_id = @companyId; +`; + +export const INSERT_ARTICLE_HISTORY = ` +INSERT INTO articlehistory (article_id, companyuser_id, [text]) +VALUES (@articleId, @companyuserId, @text); +`; + export const GET_LATEST_ROW = ` SELECT TOP 1 id, diff --git a/src/providers/sqlite3/queries/ledger.js b/src/providers/sqlite3/queries/ledger.js index 88e211a..d2d5af5 100644 --- a/src/providers/sqlite3/queries/ledger.js +++ b/src/providers/sqlite3/queries/ledger.js @@ -1,10 +1,24 @@ export const CHECK_MANIFESTARTICLE_ACCESS = ` -SELECT ma.id +SELECT ma.id, ma.sku FROM manifestarticle ma INNER JOIN manifest m ON ma.manifest_id = m.id WHERE ma.id = @manifestarticleId AND m.company_id = @companyId; `; +export const FIND_ARTICLES_FOR_HISTORY = ` +SELECT DISTINCT asup.article_id AS articleId +FROM articlesupplier asup +INNER JOIN entity e ON e.id = asup.entity_id +INNER JOIN customergroup cg ON cg.id = e.customergroup_id +WHERE asup.sku = @sku + AND cg.company_id = @companyId; +`; + +export const INSERT_ARTICLE_HISTORY = ` +INSERT INTO articlehistory (article_id, companyuser_id, text) +VALUES (@articleId, @companyuserId, @text); +`; + export const GET_LATEST_ROW = ` SELECT id, diff --git a/src/store/ledger/add.js b/src/store/ledger/add.js index 40b974f..d21318f 100644 --- a/src/store/ledger/add.js +++ b/src/store/ledger/add.js @@ -105,14 +105,15 @@ export default function add(provider) { const transactionText = String(rawTransactionText); const doAdd = async (runner) => { - const { companyId } = await access(googleAuthId, runner); + const { companyId, companyuserId, rootCategoryId } = await access(googleAuthId, runner); const check = await runner.query(queries.CHECK_MANIFESTARTICLE_ACCESS, { manifestarticleId, companyId, }); - if (!check.rows[0]) { + const manifestArticle = check.rows[0]; + if (!manifestArticle) { throw new Error('Manifest article not found'); } @@ -134,6 +135,22 @@ export default function add(provider) { throw new Error('Failed to insert ledger entry'); } + const sku = manifestArticle.sku ? String(manifestArticle.sku).trim() : ''; + if (sku) { + const articleMatches = await runner.query(queries.FIND_ARTICLES_FOR_HISTORY, { + sku, + companyId, + }); + + for (const match of articleMatches.rows) { + await runner.query(queries.INSERT_ARTICLE_HISTORY, { + articleId: match.articleId, + companyuserId, + text: transactionText, + }); + } + } + return shape(row); };