This commit is contained in:
seb
2026-09-26 23:06:05 +02:00
parent e491ecfa47
commit e7f92ebef8
41 changed files with 3632 additions and 1751 deletions

View File

@@ -386,7 +386,7 @@ export class BetterSqlite3Provider extends BetterSqlite3Executor {
}
}
// Ensure created_at exists on ledger table if created previously
// Ensure created_at and warehouse_id exist on ledger table if created previously
try {
const ledgerCols = this.db.pragma('table_info("ledger")').map((c) => c.name);
if (ledgerCols.length > 0 && !ledgerCols.includes('created_at')) {
@@ -394,6 +394,11 @@ export class BetterSqlite3Provider extends BetterSqlite3Executor {
`ALTER TABLE ledger ADD COLUMN created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`,
);
}
if (ledgerCols.length > 0 && !ledgerCols.includes('warehouse_id')) {
this.db.exec(
`ALTER TABLE ledger ADD COLUMN warehouse_id INTEGER REFERENCES warehouse(id) ON DELETE NO ACTION`,
);
}
} catch {
// ignore
}

View File

@@ -160,7 +160,24 @@ SELECT auth.*,
LEFT JOIN price pr ON pr.id = s.price_id
LEFT JOIN tax t ON t.id = pr.tax_id
WHERE s.article_id = a.id ORDER BY s.sort, s.id
)))
))),
'warehousesJson', json((SELECT COALESCE(json_group_array(json_object(
'id', w.id, 'name', w.name, 'stock', COALESCE(stock_calc.stock, 0)
)), '[]') FROM warehouse w
LEFT JOIN (
SELECT l.warehouse_id, SUM(l.amount) AS stock
FROM ledger l
INNER JOIN manifestarticle ma ON ma.id = l.manifestarticle_id
INNER JOIN manifest m ON m.id = ma.manifest_id
WHERE m.company_id = a.company_id
AND (
ma.sku = a.sku
OR ma.sku IN (SELECT asup.sku FROM articlesupplier asup WHERE asup.article_id = a.id)
)
GROUP BY l.warehouse_id
) stock_calc ON stock_calc.warehouse_id = w.id
WHERE w.company_id = a.company_id
ORDER BY w.name ASC))
) AS articleJson
FROM auth
INNER JOIN article a ON a.id = auth.articleId

View File

@@ -17,6 +17,12 @@ LEFT JOIN entity e ON e.id = m.entity_id
WHERE ma.id = @manifestarticleId AND m.company_id = @companyId;
`;
export const CHECK_WAREHOUSE_ACCESS = `
SELECT id, name
FROM warehouse
WHERE id = @warehouseId AND company_id = @companyId;
`;
export const FIND_ARTICLES_FOR_HISTORY = `
SELECT DISTINCT asup.article_id AS articleId
FROM articlesupplier asup
@@ -35,6 +41,7 @@ export const GET_LATEST_ROW = `
SELECT
id,
manifestarticle_id,
warehouse_id,
transaction_type,
amount,
transaction_text,
@@ -49,6 +56,7 @@ LIMIT 1;
export const INSERT_ROW = `
INSERT INTO ledger (
manifestarticle_id,
warehouse_id,
transaction_type,
amount,
transaction_text,
@@ -57,6 +65,7 @@ INSERT INTO ledger (
)
VALUES (
@manifestarticleId,
@warehouseId,
@transactionType,
@amount,
@transactionText,
@@ -66,6 +75,7 @@ VALUES (
RETURNING
id,
manifestarticle_id,
warehouse_id,
transaction_type,
amount,
transaction_text,
@@ -78,6 +88,7 @@ export const LIST_BY_MANIFESTARTICLE = `
SELECT
l.id,
l.manifestarticle_id,
l.warehouse_id,
ma.sku,
l.transaction_type,
l.amount,
@@ -91,6 +102,7 @@ INNER JOIN manifest m ON ma.manifest_id = m.id
WHERE l.manifestarticle_id = @manifestarticleId
AND m.company_id = @companyId
AND (@transactionType IS NULL OR l.transaction_type = @transactionType)
AND (@warehouseId IS NULL OR l.warehouse_id = @warehouseId)
ORDER BY l.id ASC;
`;
@@ -98,6 +110,7 @@ export const LIST_BY_SKU = `
SELECT
l.id,
l.manifestarticle_id,
l.warehouse_id,
ma.sku,
l.transaction_type,
l.amount,
@@ -111,5 +124,6 @@ INNER JOIN manifest m ON ma.manifest_id = m.id
WHERE ma.sku = @sku
AND m.company_id = @companyId
AND (@transactionType IS NULL OR l.transaction_type = @transactionType)
AND (@warehouseId IS NULL OR l.warehouse_id = @warehouseId)
ORDER BY l.id ASC;
`;

View File

@@ -0,0 +1,15 @@
import * as source from '../../mssql/queries/printer.js';
import { translateQueries } from './translate.js';
const queries = translateQueries(source, 'printer');
export const {
CREATE,
DELETE_BY_COMPANY_AND_ID,
GET_BY_COMPANY_AND_ID,
GET_NEXT_SORT,
LIST_BY_COMPANY,
LIST_IDS_BY_COMPANY,
PRINTER_COLUMNS,
UPDATE,
UPDATE_SORT,
} = queries;

View File

@@ -0,0 +1,48 @@
export const LIST_BY_COMPANY = `
SELECT
id,
company_id,
name
FROM warehouse
WHERE company_id = @companyId
ORDER BY name ASC;
`;
export const GET_BY_COMPANY_AND_ID = `
SELECT
id,
company_id,
name
FROM warehouse
WHERE id = @id AND company_id = @companyId;
`;
export const GET_BY_COMPANY_AND_NAME = `
SELECT
id,
company_id,
name
FROM warehouse
WHERE company_id = @companyId AND name = @name;
`;
export const CREATE = `
INSERT INTO warehouse (company_id, name)
VALUES (@companyId, @name)
RETURNING id, company_id, name;
`;
export const UPDATE_BY_ID = `
UPDATE warehouse
SET name = @name
WHERE id = @id AND company_id = @companyId;
`;
export const DELETE_BY_COMPANY_AND_ID = `
DELETE FROM warehouse
WHERE id = @id AND company_id = @companyId;
`;
export const CHECK_LEDGER_USAGE = `
SELECT id FROM ledger WHERE warehouse_id = @warehouseId LIMIT 1;
`;

View File

@@ -426,18 +426,30 @@ CREATE TABLE IF NOT EXISTS manifestarticle (
);
`;
export const INIT_WAREHOUSE = `
CREATE TABLE IF NOT EXISTS warehouse (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL COLLATE NOCASE,
UNIQUE (company_id, name),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
/* SQLite has no SQL Server ledger tables; constraints preserve the base shape. */
export const INIT_LEDGER = `
CREATE TABLE IF NOT EXISTS ledger (
id INTEGER PRIMARY KEY,
manifestarticle_id INTEGER NOT NULL,
warehouse_id INTEGER,
transaction_type TEXT NOT NULL,
amount REAL NOT NULL,
transaction_text TEXT NOT NULL,
hash_version INTEGER NOT NULL,
prev_hash TEXT,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (manifestarticle_id) REFERENCES manifestarticle(id) ON DELETE NO ACTION
FOREIGN KEY (manifestarticle_id) REFERENCES manifestarticle(id) ON DELETE NO ACTION,
FOREIGN KEY (warehouse_id) REFERENCES warehouse(id) ON DELETE NO ACTION
);
`;
@@ -536,6 +548,21 @@ CREATE TABLE IF NOT EXISTS posterminalcategory (
);
`;
export const INIT_PRINTER = `
CREATE TABLE IF NOT EXISTS printer (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
address TEXT NOT NULL,
type TEXT NOT NULL CHECK (type IN ('esc/pos', 'zpl')),
model TEXT,
serial TEXT,
sort INTEGER NOT NULL DEFAULT 0,
"desc" TEXT,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_FILE = `
CREATE TABLE IF NOT EXISTS "file" (
id INTEGER PRIMARY KEY,
@@ -608,6 +635,7 @@ export const SCHEMA_SCRIPTS = [
INIT_ARTICLE_SUPPLIER,
INIT_MANIFEST,
INIT_MANIFESTARTICLE,
INIT_WAREHOUSE,
INIT_LEDGER,
INIT_NUMBERS,
INIT_COMPANYUSER,
@@ -617,6 +645,7 @@ export const SCHEMA_SCRIPTS = [
INIT_COMPANYSETTING,
INIT_POSTERMINAL,
INIT_POSTERMINALCATEGORY,
INIT_PRINTER,
INIT_FILE,
INIT_MANIFESTATTACHMENT,
INIT_MANIFESTATTACHMENT_TRIGGER,