Files
dashlibstorage/src/providers/sqlite3/schema.js
2026-10-07 16:46:41 +02:00

844 lines
26 KiB
JavaScript

const UTC_NOW = "strftime('%Y-%m-%dT%H:%M:%fZ', 'now')";
export const INIT_META = `
CREATE TABLE IF NOT EXISTS meta (
"key" TEXT PRIMARY KEY,
value TEXT NOT NULL
);
INSERT OR IGNORE INTO meta ("key", value) VALUES ('version', '1');
`;
export const INIT_LANGUAGE = `
CREATE TABLE IF NOT EXISTS language (
id INTEGER PRIMARY KEY,
iso639 TEXT NOT NULL COLLATE NOCASE UNIQUE
);
`;
export const INIT_TAX = `
CREATE TABLE IF NOT EXISTS tax (
id INTEGER PRIMARY KEY,
rate NUMERIC NOT NULL UNIQUE
);
INSERT OR IGNORE INTO tax (rate) VALUES (0), (7), (19);
`;
export const INIT_CATEGORY = `
CREATE TABLE IF NOT EXISTS category (
id INTEGER PRIMARY KEY,
parent_id INTEGER,
sort INTEGER NOT NULL DEFAULT 0,
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (parent_id) REFERENCES category(id) ON DELETE NO ACTION
);
`;
export const INIT_PIC = `
CREATE TABLE IF NOT EXISTS pic (
id INTEGER PRIMARY KEY,
w INTEGER NOT NULL,
h INTEGER NOT NULL,
size INTEGER NOT NULL,
hash TEXT NOT NULL UNIQUE,
thumbw INTEGER NOT NULL,
thumbh INTEGER NOT NULL,
thumbhash TEXT NOT NULL,
source TEXT NOT NULL
);
`;
export const INIT_COMPANY = `
CREATE TABLE IF NOT EXISTS company (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL COLLATE NOCASE UNIQUE,
root_category_id INTEGER,
default_language_id INTEGER,
taxrate INTEGER,
reducedtaxrate INTEGER,
taxfreerate INTEGER,
poscustomergroup_id INTEGER NOT NULL,
FOREIGN KEY (root_category_id) REFERENCES category(id) ON DELETE SET NULL,
FOREIGN KEY (default_language_id) REFERENCES language(id) ON DELETE SET NULL,
FOREIGN KEY (taxrate) REFERENCES tax(id) ON DELETE NO ACTION,
FOREIGN KEY (reducedtaxrate) REFERENCES tax(id) ON DELETE NO ACTION,
FOREIGN KEY (taxfreerate) REFERENCES tax(id) ON DELETE NO ACTION,
FOREIGN KEY (poscustomergroup_id) REFERENCES customergroup(id) ON DELETE NO ACTION
);
`;
export const INIT_GOOGLE_AUTH = `
CREATE TABLE IF NOT EXISTS google_auth (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL COLLATE NOCASE UNIQUE,
picture TEXT,
picturebinary BLOB,
sub TEXT,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
selected_company INTEGER,
FOREIGN KEY (selected_company) REFERENCES company(id) ON DELETE SET NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS UQ_google_auth_sub
ON google_auth(sub) WHERE sub IS NOT NULL;
`;
export const INIT_CUSTOMERGROUP = `
CREATE TABLE IF NOT EXISTS customergroup (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
company_id INTEGER,
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
/* The FK is declared inline in INIT_COMPANY; SQLite cannot add it later. */
export const INIT_COMPANY_POS_CUSTOMERGROUP_FK = '';
export const INIT_ENTITY = `
CREATE TABLE IF NOT EXISTS entity (
id INTEGER PRIMARY KEY,
customergroup_id INTEGER NOT NULL,
company_id INTEGER,
first_name TEXT,
name TEXT NOT NULL,
"number" TEXT,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (customergroup_id) REFERENCES customergroup(id) ON DELETE CASCADE,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
/**
* SQLite cannot index a joined view, so company_id is denormalized onto entity.
* Triggers keep it synchronized with the entity's customer group.
*/
export const INIT_ENTITY_COMPANY_NUMBER_UQ = `
CREATE UNIQUE INDEX IF NOT EXISTS UQ_entity_company_number
ON entity(company_id, "number") WHERE "number" IS NOT NULL;
CREATE TRIGGER IF NOT EXISTS TR_entity_set_company_insert
AFTER INSERT ON entity
BEGIN
UPDATE entity
SET company_id = (SELECT company_id FROM customergroup WHERE id = NEW.customergroup_id)
WHERE id = NEW.id;
END;
CREATE TRIGGER IF NOT EXISTS TR_entity_set_company_update
AFTER UPDATE OF customergroup_id ON entity
BEGIN
UPDATE entity
SET company_id = (SELECT company_id FROM customergroup WHERE id = NEW.customergroup_id)
WHERE id = NEW.id;
END;
CREATE TRIGGER IF NOT EXISTS TR_customergroup_sync_entity_company
AFTER UPDATE OF company_id ON customergroup
BEGIN
UPDATE entity SET company_id = NEW.company_id WHERE customergroup_id = NEW.id;
END;
`;
export const INIT_ENTITYADDRESS = `
CREATE TABLE IF NOT EXISTS entityaddress (
id INTEGER PRIMARY KEY,
entity_id INTEGER NOT NULL,
first_name TEXT,
name TEXT,
street TEXT,
streetnumber TEXT,
zip TEXT,
city TEXT,
county TEXT,
addresstype TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE
);
`;
export const INIT_ENTITYCONTACT = `
CREATE TABLE IF NOT EXISTS entitycontact (
id INTEGER PRIMARY KEY,
entity_id INTEGER NOT NULL,
contacttype TEXT NOT NULL,
contact TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE
);
`;
export const INIT_UNIT = `
CREATE TABLE IF NOT EXISTS unit (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
si TEXT NOT NULL,
basesi TEXT NOT NULL,
basesifactor REAL NOT NULL,
UNIQUE (company_id, si),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE NO ACTION
);
`;
export const INIT_UNITTEXT = `
CREATE TABLE IF NOT EXISTS unittext (
id INTEGER PRIMARY KEY,
unit_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
symbol TEXT NOT NULL,
name TEXT NOT NULL,
UNIQUE (unit_id, language_id),
FOREIGN KEY (unit_id) REFERENCES unit(id) ON DELETE CASCADE,
FOREIGN KEY (language_id) REFERENCES language(id) ON DELETE CASCADE
);
`;
export const INIT_OPTIONSLIST = `
CREATE TABLE IF NOT EXISTS optionslist (id INTEGER PRIMARY KEY);
`;
export const INIT_ARTICLELIST = `
CREATE TABLE IF NOT EXISTS articlelist (id INTEGER PRIMARY KEY);
`;
export const INIT_BRAND = `
CREATE TABLE IF NOT EXISTS brand (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL COLLATE NOCASE,
gsprpinfo TEXT,
UNIQUE (company_id, name),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE NO ACTION
);
`;
export const INIT_ARTICLE = `
CREATE TABLE IF NOT EXISTS article (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
sku TEXT COLLATE NOCASE,
unit_id INTEGER NOT NULL,
unitamount REAL NOT NULL,
weight REAL NOT NULL,
track_stock INTEGER NOT NULL DEFAULT 1,
brand_id INTEGER,
articlelist_id INTEGER,
optionslist_id INTEGER,
is_parent INTEGER NOT NULL DEFAULT 0,
parentarticle_id INTEGER,
parentsort INTEGER NOT NULL DEFAULT 0,
parentattributename_id INTEGER,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
UNIQUE (company_id, sku),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
FOREIGN KEY (unit_id) REFERENCES unit(id) ON DELETE NO ACTION,
FOREIGN KEY (brand_id) REFERENCES brand(id) ON DELETE SET NULL,
FOREIGN KEY (articlelist_id) REFERENCES articlelist(id) ON DELETE SET NULL,
FOREIGN KEY (optionslist_id) REFERENCES optionslist(id) ON DELETE SET NULL,
FOREIGN KEY (parentarticle_id) REFERENCES article(id) ON DELETE NO ACTION,
FOREIGN KEY (parentattributename_id) REFERENCES attributename(id) ON DELETE NO ACTION
);
CREATE UNIQUE INDEX IF NOT EXISTS UQ_article_parentarticle_parentsort
ON article(parentarticle_id, parentsort)
WHERE parentarticle_id IS NOT NULL;
`;
export const INIT_ARTICLEEAN = `
CREATE TABLE IF NOT EXISTS articleean (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
ean TEXT NOT NULL UNIQUE,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_articleean_article_ean
ON articleean(article_id, ean);
`;
export const INIT_ARTICLEPIC = `
CREATE TABLE IF NOT EXISTS articlepic (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
pic_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (article_id, pic_id),
UNIQUE (article_id, sort),
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (pic_id) REFERENCES pic(id) ON DELETE CASCADE
);
`;
export const INIT_BRANDPIC = `
CREATE TABLE IF NOT EXISTS brandpic (
id INTEGER PRIMARY KEY,
brand_id INTEGER NOT NULL,
pic_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (brand_id, pic_id),
UNIQUE (brand_id, sort),
FOREIGN KEY (brand_id) REFERENCES brand(id) ON DELETE CASCADE,
FOREIGN KEY (pic_id) REFERENCES pic(id) ON DELETE CASCADE
);
`;
export const INIT_ARTICLELISTARTICLE = `
CREATE TABLE IF NOT EXISTS articlelistarticle (
id INTEGER PRIMARY KEY,
articlelist_id INTEGER NOT NULL,
article_id INTEGER NOT NULL,
count INTEGER NOT NULL DEFAULT 1,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (articlelist_id, article_id),
UNIQUE (articlelist_id, sort),
FOREIGN KEY (articlelist_id) REFERENCES articlelist(id) ON DELETE CASCADE,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE
);
`;
export const INIT_OPTIONSLISTARTICLE = `
CREATE TABLE IF NOT EXISTS optionslistarticle (
id INTEGER PRIMARY KEY,
optionslist_id INTEGER NOT NULL,
article_id INTEGER NOT NULL,
count INTEGER NOT NULL DEFAULT 1,
sort INTEGER NOT NULL DEFAULT 0,
mandated INTEGER NOT NULL DEFAULT 0,
UNIQUE (optionslist_id, article_id),
UNIQUE (optionslist_id, sort),
FOREIGN KEY (optionslist_id) REFERENCES optionslist(id) ON DELETE CASCADE,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE
);
`;
export const INIT_CATEGORYARTICLE = `
CREATE TABLE IF NOT EXISTS categoryarticle (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
article_id INTEGER NOT NULL,
UNIQUE (category_id, article_id),
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE NO ACTION,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_categoryarticle_article_category
ON categoryarticle(article_id, category_id);
`;
export const INIT_CATEGORYPIC = `
CREATE TABLE IF NOT EXISTS categorypic (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
pic_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (category_id, pic_id),
UNIQUE (category_id, sort),
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE CASCADE,
FOREIGN KEY (pic_id) REFERENCES pic(id) ON DELETE CASCADE
);
`;
export const INIT_CATEGORYTEXT = `
CREATE TABLE IF NOT EXISTS categorytext (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
name TEXT NOT NULL,
slug TEXT NOT NULL,
seo TEXT,
"desc" TEXT,
UNIQUE (category_id, language_id),
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE CASCADE,
FOREIGN KEY (language_id) REFERENCES language(id) ON DELETE CASCADE
);
`;
export const INIT_ARTICLENAME = `
CREATE TABLE IF NOT EXISTS articletext (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
language_id INTEGER NOT NULL,
name TEXT NOT NULL,
slug TEXT NOT NULL,
seo TEXT,
"desc" TEXT,
UNIQUE (article_id, language_id),
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (language_id) REFERENCES language(id) ON DELETE CASCADE
);
`;
export const INIT_PRICE = `
CREATE TABLE IF NOT EXISTS price (
id INTEGER PRIMARY KEY,
tax_id INTEGER NOT NULL,
article_id INTEGER NOT NULL,
minmultiplier NUMERIC NOT NULL DEFAULT 1,
customergroup_id INTEGER NOT NULL,
net REAL NOT NULL,
FOREIGN KEY (tax_id) REFERENCES tax(id) ON DELETE CASCADE,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (customergroup_id) REFERENCES customergroup(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_price_article_cg_mult
ON price(article_id, customergroup_id, minmultiplier, net, tax_id);
`;
export const INIT_ARTICLE_SUPPLIER = `
CREATE TABLE IF NOT EXISTS articlesupplier (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
entity_id INTEGER NOT NULL,
net REAL,
tax_id INTEGER,
sku TEXT,
stock REAL,
pu REAL NOT NULL DEFAULT 1,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (article_id, entity_id),
UNIQUE (article_id, sort),
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE,
FOREIGN KEY (tax_id) REFERENCES tax(id) ON DELETE NO ACTION
);
CREATE INDEX IF NOT EXISTS IX_articlesupplier_article_entity
ON articlesupplier(article_id, entity_id);
`;
export const INIT_MANIFEST = `
CREATE TABLE IF NOT EXISTS manifest (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
"number" TEXT NOT NULL,
"type" TEXT NOT NULL,
entity_id INTEGER,
external_number TEXT,
"date" TEXT NOT NULL DEFAULT (${UTC_NOW}),
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE NO ACTION,
FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE SET NULL
);
`;
export const INIT_MANIFESTARTICLE = `
CREATE TABLE IF NOT EXISTS manifestarticle (
id INTEGER PRIMARY KEY,
manifest_id INTEGER NOT NULL,
sku TEXT,
name TEXT,
pu REAL NOT NULL DEFAULT 1,
amount REAL NOT NULL,
net REAL NOT NULL,
comment TEXT,
rebate REAL NOT NULL DEFAULT 0,
taxrate REAL NOT NULL DEFAULT 0,
FOREIGN KEY (manifest_id) REFERENCES manifest(id) ON DELETE CASCADE
);
`;
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,
sort INTEGER NOT NULL DEFAULT 0,
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 (warehouse_id) REFERENCES warehouse(id) ON DELETE NO ACTION
);
`;
export const INIT_NUMBERS = `
CREATE TABLE IF NOT EXISTS numbers (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
"type" TEXT NOT NULL,
prefix TEXT NOT NULL DEFAULT '',
padding INTEGER NOT NULL DEFAULT 0,
"next" INTEGER NOT NULL DEFAULT 1,
UNIQUE (company_id, "type"),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_COMPANYUSER = `
CREATE TABLE IF NOT EXISTS companyuser (
id INTEGER PRIMARY KEY,
google_auth_id INTEGER NOT NULL,
company_id INTEGER NOT NULL,
UNIQUE (google_auth_id, company_id),
FOREIGN KEY (google_auth_id) REFERENCES google_auth(id) ON DELETE CASCADE,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_MODELCONVERSATION = `
CREATE TABLE IF NOT EXISTS modelconversation (
id INTEGER PRIMARY KEY,
companyuser_id INTEGER NOT NULL,
provider TEXT NOT NULL,
model TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
state TEXT NOT NULL DEFAULT 'idle' CHECK (state IN ('idle', 'busy')),
FOREIGN KEY (companyuser_id) REFERENCES companyuser(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_modelconversation_companyuser ON modelconversation (companyuser_id, updated_at);
`;
export const INIT_MODELVFS = `
CREATE TABLE IF NOT EXISTS modelvfs (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL,
mime TEXT NOT NULL,
meta TEXT,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
updated_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
UNIQUE (company_id, name)
);
CREATE INDEX IF NOT EXISTS IX_modelvfs_company_name ON modelvfs (company_id, name);
`;
export const INIT_MODELMESSAGE = `
CREATE TABLE IF NOT EXISTS modelmessage (
id INTEGER PRIMARY KEY,
conversation_id INTEGER NOT NULL,
created_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
role TEXT NOT NULL CHECK (role IN ('system', 'user', 'assistant', 'tool', 'reasoning', 'usage')),
message TEXT NOT NULL,
FOREIGN KEY (conversation_id) REFERENCES modelconversation(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_modelmessage_conversation ON modelmessage (conversation_id, id);
`;
export const INIT_ARTICLEHISTORY = `
CREATE TABLE IF NOT EXISTS articlehistory (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
companyuser_id INTEGER,
"date" TEXT NOT NULL DEFAULT (${UTC_NOW}),
"text" TEXT NOT NULL,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (companyuser_id) REFERENCES companyuser(id) ON DELETE SET NULL
);
`;
export const INIT_COMPANYHISTORY = `
CREATE TABLE IF NOT EXISTS companyhistory (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
companyuser_id INTEGER,
"date" TEXT NOT NULL DEFAULT (${UTC_NOW}),
"text" TEXT NOT NULL,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
FOREIGN KEY (companyuser_id) REFERENCES companyuser(id) ON DELETE SET NULL
);
`;
export const INIT_ARTICLETOMBSTONE = `
CREATE TABLE IF NOT EXISTS articletombstone (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
article_id INTEGER,
sku TEXT COLLATE NOCASE,
name TEXT,
taxrate NUMERIC,
net REAL,
deleted_at TEXT NOT NULL DEFAULT (${UTC_NOW}),
CHECK (article_id IS NOT NULL OR sku IS NOT NULL),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS IX_articletombstone_company_deleted
ON articletombstone (company_id, deleted_at);
`;
export const INIT_ENTITYHISTORY = `
CREATE TABLE IF NOT EXISTS entityhistory (
id INTEGER PRIMARY KEY,
entity_id INTEGER NOT NULL,
companyuser_id INTEGER,
"date" TEXT NOT NULL DEFAULT (${UTC_NOW}),
"text" TEXT NOT NULL,
FOREIGN KEY (entity_id) REFERENCES entity(id) ON DELETE CASCADE,
FOREIGN KEY (companyuser_id) REFERENCES companyuser(id) ON DELETE NO ACTION
);
`;
export const INIT_SYNCPOS = `
CREATE TABLE IF NOT EXISTS syncpos (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
paircode TEXT NOT NULL UNIQUE,
token TEXT UNIQUE,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_COMPANYSETTING = `
CREATE TABLE IF NOT EXISTS companysetting (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
"key" TEXT NOT NULL,
value TEXT NOT NULL,
frontend INTEGER NOT NULL DEFAULT 0,
writeonly INTEGER NOT NULL DEFAULT 0,
UNIQUE (company_id, "key"),
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_POSTERMINAL = `
CREATE TABLE IF NOT EXISTS posterminal (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL,
token TEXT,
pairingpin TEXT NOT NULL,
paired_at TEXT,
clientserial TEXT,
maxknowntombstoneid INTEGER,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
CREATE UNIQUE INDEX IF NOT EXISTS UQ_posterminal_token
ON posterminal(token) WHERE token IS NOT NULL;
`;
export const INIT_POSTERMINALCATEGORY = `
CREATE TABLE IF NOT EXISTS posterminalcategory (
id INTEGER PRIMARY KEY,
posterminal_id INTEGER NOT NULL,
category_id INTEGER NOT NULL,
UNIQUE (posterminal_id, category_id),
FOREIGN KEY (posterminal_id) REFERENCES posterminal(id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE NO ACTION
);
`;
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', 'ipp')),
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_LABELTEMPLATE = `
CREATE TABLE IF NOT EXISTS labeltemplate (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL,
width INTEGER NOT NULL,
height INTEGER NOT NULL,
dpi INTEGER NOT NULL CHECK (dpi IN (203, 300)),
type TEXT NOT NULL CHECK (type IN ('zpl')),
content TEXT NOT NULL,
thumb BLOB,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE
);
`;
export const INIT_FILE = `
CREATE TABLE IF NOT EXISTS "file" (
id INTEGER PRIMARY KEY,
hash TEXT NOT NULL,
mimetype TEXT NOT NULL,
name TEXT NOT NULL,
size INTEGER NOT NULL,
created TEXT NOT NULL DEFAULT (${UTC_NOW}),
modified TEXT NOT NULL DEFAULT (${UTC_NOW}),
thumbx INTEGER,
thumby INTEGER,
meta TEXT
);
`;
export const INIT_MANIFESTATTACHMENT = `
CREATE TABLE IF NOT EXISTS manifestattachment (
id INTEGER PRIMARY KEY,
manifest_id INTEGER NOT NULL,
file_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
UNIQUE (manifest_id, sort),
FOREIGN KEY (manifest_id) REFERENCES manifest(id) ON DELETE CASCADE,
FOREIGN KEY (file_id) REFERENCES "file"(id) ON DELETE CASCADE
);
`;
export const INIT_MANIFESTATTACHMENT_TRIGGER = `
CREATE TRIGGER IF NOT EXISTS TR_manifestattachment_delete_file
AFTER DELETE ON manifestattachment
BEGIN
DELETE FROM "file"
WHERE id = OLD.file_id
AND NOT EXISTS (
SELECT 1 FROM manifestattachment WHERE file_id = OLD.file_id
);
END;
`;
export const INIT_PROPERTYNAME = `
CREATE TABLE IF NOT EXISTS propertyname (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
exclusive INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
UNIQUE (company_id, name)
);
`;
export const INIT_ARTICLEPROPERTY = `
CREATE TABLE IF NOT EXISTS articleproperty (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
property_id INTEGER NOT NULL,
value TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (property_id) REFERENCES propertyname(id) ON DELETE NO ACTION
);
`;
export const INIT_ATTRIBUTENAME = `
CREATE TABLE IF NOT EXISTS attributename (
id INTEGER PRIMARY KEY,
company_id INTEGER NOT NULL,
name TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
exclusive INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
UNIQUE (company_id, name)
);
`;
export const INIT_ATTRIBUTEVALUE = `
CREATE TABLE IF NOT EXISTS attributevalue (
id INTEGER PRIMARY KEY,
attribute_id INTEGER NOT NULL,
value TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (attribute_id) REFERENCES attributename(id) ON DELETE CASCADE,
UNIQUE (attribute_id, value)
);
`;
export const INIT_ARTICLEATTRIBUTEVALUE = `
CREATE TABLE IF NOT EXISTS articleattributevalue (
id INTEGER PRIMARY KEY,
article_id INTEGER NOT NULL,
attributevalue_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (article_id) REFERENCES article(id) ON DELETE CASCADE,
FOREIGN KEY (attributevalue_id) REFERENCES attributevalue(id) ON DELETE NO ACTION,
UNIQUE (article_id, attributevalue_id)
);
`;
export const INIT_CATEGORYPROPERTY = `
CREATE TABLE IF NOT EXISTS categoryproperty (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
property_id INTEGER NOT NULL,
value TEXT NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE CASCADE,
FOREIGN KEY (property_id) REFERENCES propertyname(id) ON DELETE NO ACTION
);
`;
export const INIT_CATEGORYATTRIBUTEVALUE = `
CREATE TABLE IF NOT EXISTS categoryattributevalue (
id INTEGER PRIMARY KEY,
category_id INTEGER NOT NULL,
attributevalue_id INTEGER NOT NULL,
sort INTEGER NOT NULL DEFAULT 0,
FOREIGN KEY (category_id) REFERENCES category(id) ON DELETE CASCADE,
FOREIGN KEY (attributevalue_id) REFERENCES attributevalue(id) ON DELETE CASCADE,
UNIQUE (category_id, attributevalue_id)
);
`;
/** DDL scripts in dependency order for SQLite schema initialization. */
export const SCHEMA_SCRIPTS = [
INIT_META,
INIT_LANGUAGE,
INIT_TAX,
INIT_CATEGORY,
INIT_PIC,
INIT_COMPANY,
INIT_GOOGLE_AUTH,
INIT_CUSTOMERGROUP,
INIT_ENTITY,
INIT_ENTITY_COMPANY_NUMBER_UQ,
INIT_ENTITYADDRESS,
INIT_ENTITYCONTACT,
INIT_UNIT,
INIT_UNITTEXT,
INIT_OPTIONSLIST,
INIT_ARTICLELIST,
INIT_BRAND,
INIT_PROPERTYNAME,
INIT_ATTRIBUTENAME,
INIT_ATTRIBUTEVALUE,
INIT_ARTICLE,
INIT_ARTICLEEAN,
INIT_ARTICLEPIC,
INIT_BRANDPIC,
INIT_ARTICLELISTARTICLE,
INIT_OPTIONSLISTARTICLE,
INIT_CATEGORYARTICLE,
INIT_CATEGORYPIC,
INIT_CATEGORYTEXT,
INIT_ARTICLENAME,
INIT_PRICE,
INIT_ARTICLE_SUPPLIER,
INIT_ARTICLEPROPERTY,
INIT_ARTICLEATTRIBUTEVALUE,
INIT_CATEGORYPROPERTY,
INIT_CATEGORYATTRIBUTEVALUE,
INIT_MANIFEST,
INIT_MANIFESTARTICLE,
INIT_WAREHOUSE,
INIT_LEDGER,
INIT_NUMBERS,
INIT_COMPANYUSER,
INIT_MODELCONVERSATION,
INIT_MODELMESSAGE,
INIT_MODELVFS,
INIT_ARTICLEHISTORY,
INIT_ARTICLETOMBSTONE,
INIT_ENTITYHISTORY,
INIT_COMPANYHISTORY,
INIT_SYNCPOS,
INIT_COMPANYSETTING,
INIT_POSTERMINAL,
INIT_POSTERMINALCATEGORY,
INIT_PRINTER,
INIT_LABELTEMPLATE,
INIT_FILE,
INIT_MANIFESTATTACHMENT,
INIT_MANIFESTATTACHMENT_TRIGGER,
];