Files
dashlibstorage/scripts/benchmark/workload.js
2026-10-28 01:46:48 +01:00

776 lines
25 KiB
JavaScript

import { optimizeImage } from 'wasm-image-optimization';
/**
* Creates sample PNG image buffer.
*/
async function makeSampleImage(width = 200, height = 200, color = { r: 50, g: 120, b: 220 }) {
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}"><rect width="${width}" height="${height}" fill="rgb(${color.r},${color.g},${color.b})"/></svg>`;
const res = await optimizeImage({ image: svg, format: 'png' });
return Buffer.from(res.data);
}
/**
* Creates sample AVIF thumbnail buffer.
*/
async function makeSampleThumb(width = 64, height = 64) {
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}"><rect width="${width}" height="${height}" fill="rgb(200,60,60)"/></svg>`;
const res = await optimizeImage({ image: svg, format: 'avif' });
return Buffer.from(res.data);
}
/**
* Executes Phase 1: Database Population / Fill.
* Systematically calls creation and write APIs to populate the database
* with realistic entities and relationships according to the configured scale.
*/
export async function fillDatabase(store, options = {}) {
const scale = options.scale || 'small';
const counts = {
small: { categories: 6, articles: 18, entities: 6, manifests: 6 },
medium: { categories: 15, articles: 60, entities: 20, manifests: 20 },
large: { categories: 30, articles: 200, entities: 50, manifests: 60 },
}[scale] || { categories: 6, articles: 18, entities: 6, manifests: 6 };
const ctx = {
googleAuthId: null,
company: null,
secondaryGoogleAuthId: null,
secondaryCompany: null,
categories: [],
articles: [],
parentArticles: [],
childArticles: [],
customergroups: [],
entities: [],
suppliers: [],
deliveries: [],
orders: [],
quotes: [],
terminals: [],
sampleImageHash: null,
sampleImageThumbHash: null,
attachments: [],
};
const sampleImage = await makeSampleImage();
const sampleThumb = await makeSampleThumb();
// 1. Google Auth setup
const primaryEmail = `benchmark.admin.${Date.now()}@example.com`;
const secEmail = `benchmark.secondary.${Date.now()}@example.com`;
ctx.googleAuthId = await store.google_auth.add(primaryEmail);
await store.google_auth.setProfile(ctx.googleAuthId, {
sub: `sub-${ctx.googleAuthId}`,
picture: 'https://example.com/pic.png',
});
await store.google_auth.listAllowedEmails();
ctx.secondaryGoogleAuthId = await store.google_auth.add(secEmail);
// 2. Company setup
ctx.company = await store.company.create({
name: `Bench Corp ${Date.now()}`,
iso639: 'de',
taxrate: 19,
reducedtaxrate: 7,
googleAuthId: ctx.googleAuthId,
});
await store.google_auth.setSelectedCompany(ctx.googleAuthId, ctx.company.id);
ctx.secondaryCompany = await store.company.create({
name: `Secondary Corp ${Date.now()}`,
iso639: 'en',
taxrate: 20,
reducedtaxrate: 10,
googleAuthId: ctx.secondaryGoogleAuthId,
});
await store.google_auth.setSelectedCompany(ctx.secondaryGoogleAuthId, ctx.secondaryCompany.id);
await store.company.update(ctx.company.id, {
name: `Bench Corp Updated ${Date.now()}`,
iso639: 'de',
taxrate: 19,
reducedtaxrate: 7,
});
await store.company.list(ctx.googleAuthId);
// 3. Company Users
const compUserId = await store.companyuser.add(ctx.company.id, ctx.secondaryGoogleAuthId);
ctx.compUserId = compUserId;
await store.companyuser.getByEmail(secEmail);
// 4. Lang APIs
await store.lang.ensure('en');
await store.lang.ensure('fr');
await store.lang.create('es');
await store.lang.getByIso639('en');
await store.lang.list();
// 5. Tax APIs
await store.tax.ensure(19);
await store.tax.ensure(7);
const taxIdSample = await store.tax.create(5.5);
ctx.taxSampleId = taxIdSample;
await store.tax.getByRate(19);
await store.tax.list();
// 6. Unit APIs
await store.unit.upsert(ctx.googleAuthId, {
si: 'kg',
basesi: 'g',
basesifactor: 1000,
symbol: 'kg',
name: 'Kilogramm',
});
await store.unit.upsert(ctx.googleAuthId, {
si: 'stk',
basesi: 'stk',
basesifactor: 1,
symbol: 'Stk',
name: 'Stück',
});
await store.unit.list(ctx.googleAuthId);
// 7. Company Settings
await store.companysetting.set(ctx.googleAuthId, {
key: 'ui.theme',
value: 'dark',
frontend: true,
writeonly: false,
});
await store.companysetting.set(ctx.googleAuthId, {
key: 'default-model',
value: 'openai/gpt-6-luna:floor',
frontend: false,
writeonly: false,
});
await store.companysetting.get(ctx.googleAuthId, 'ui.theme');
await store.companysetting.list(ctx.googleAuthId);
// 8. Brand APIs
const brand1 = await store.brand.upsert(ctx.googleAuthId, {
name: 'BenchBrand Pro',
gsprpinfo: 'Manufacturer Pro GmbH',
});
const brand2 = await store.brand.upsert(ctx.googleAuthId, {
name: 'BenchBrand Ultra',
gsprpinfo: 'Manufacturer Ultra AG',
});
ctx.brands = [brand1, brand2];
await store.brand.list(ctx.googleAuthId);
// 9. Customer Groups
const cgVip = await store.customergroup.create(ctx.googleAuthId, { name: 'VIP Members' });
const cgRetail = await store.customergroup.create(ctx.googleAuthId, { name: 'Retail Customers' });
await store.customergroup.update(ctx.googleAuthId, cgVip.id, { name: 'VIP Gold Members' });
const allCgs = await store.customergroup.list(ctx.googleAuthId);
await store.customergroup.order(ctx.googleAuthId, {
customergroupIds: allCgs.map((g) => g.id).reverse(),
});
await store.customergroup.list(ctx.googleAuthId);
ctx.customergroups.push(cgRetail, cgVip);
// 10. Categories Hierarchy
const rootCatId = ctx.company.rootCategoryId;
const numCats = counts.categories;
for (let i = 1; i <= numCats; i++) {
const parentId = i > 3 && ctx.categories.length > 0 ? ctx.categories[(i % 3)].id : rootCatId;
const cat = await store.category.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId,
name: `Category ${i}`,
});
ctx.categories.push(cat);
}
// Ensure by path
const deepCatId = await store.category.ensureByPath({
googleAuthId: ctx.googleAuthId,
parentId: rootCatId,
path: 'Hardware / Components / Processors',
});
ctx.deepCatId = deepCatId;
// Category manipulation APIs
if (ctx.categories.length >= 2) {
await store.category.rename({
googleAuthId: ctx.googleAuthId,
id: ctx.categories[0].id,
name: 'Main Catalog Category',
});
const orderParent = await store.category.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: rootCatId,
name: 'Order Test Parent',
});
const oChild1 = await store.category.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: orderParent.id,
name: 'Order Child 1',
});
const oChild2 = await store.category.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: orderParent.id,
name: 'Order Child 2',
});
await store.category.move({
googleAuthId: ctx.googleAuthId,
id: oChild2.id,
parentId: orderParent.id,
});
await store.category.order({
googleAuthId: ctx.googleAuthId,
parentId: orderParent.id,
categoryIds: [oChild2.id, oChild1.id],
});
}
// Category image
await store.category.addImage(ctx.googleAuthId, ctx.categories[0].id, sampleImage);
// 11. Numbers APIs
const numList = await store.numbers.list(ctx.googleAuthId);
if (numList.length > 0) {
await store.numbers.update(ctx.googleAuthId, numList[0].id, {
prefix: 'BN-',
padding: 6,
next: 1001,
});
}
// 12. POS Terminals
const term1 = await store.posterminal.upsert(ctx.googleAuthId, {
name: 'Counter Terminal 1',
pairingpin: '1234',
});
const term2 = await store.posterminal.upsert(ctx.googleAuthId, {
name: 'Mobile Terminal 2',
pairingpin: '5678',
});
ctx.terminals.push(term1, term2);
await store.posterminal.setOn(ctx.googleAuthId, term1.id, ctx.categories[0].id);
await store.posterminal.setOff(ctx.googleAuthId, term1.id, ctx.categories[0].id);
await store.posterminal.setOnAll(ctx.googleAuthId, term1.id);
await store.posterminal.setOffAll(ctx.googleAuthId, term1.id);
await store.posterminal.getCategoryPosterminalIds(ctx.googleAuthId, ctx.categories[0].id);
await store.posterminal.list(ctx.googleAuthId);
// 13. Entities (Customers)
const numEntities = counts.entities;
for (let i = 1; i <= numEntities; i++) {
const nextNum = await store.entity.peekNextNumber(ctx.googleAuthId);
await store.entity.isNumberFree(ctx.googleAuthId, nextNum);
const ent = await store.entity.create(ctx.googleAuthId, {
customergroupId: ctx.customergroups[i % ctx.customergroups.length].id,
name: `Customer Company ${i}`,
firstName: `Firstname ${i}`,
});
ctx.entities.push(ent);
// Entity Address
const addr = await store.entityaddress.create(ctx.googleAuthId, ent.id, {
addressType: 'shipping',
name: `Branch ${i}`,
street: `Main Street ${i}`,
streetNumber: `${i}`,
zip: '10115',
city: 'Berlin',
county: 'Berlin',
sort: 1,
});
await store.entityaddress.update(ctx.googleAuthId, ent.id, addr.id, {
street: `Updated Street ${i}`,
});
// Entity Contact
const contact = await store.entitycontact.create(ctx.googleAuthId, ent.id, {
contactType: 'email',
contact: `contact${i}@benchmark.test`,
sort: 1,
});
await store.entitycontact.update(ctx.googleAuthId, ent.id, contact.id, {
contact: `updated-contact${i}@benchmark.test`,
});
}
// 14. Suppliers
for (let i = 1; i <= 3; i++) {
const sup = await store.supplier.create(ctx.googleAuthId, {
name: `Supplier Express ${i}`,
});
await store.supplier.update(ctx.googleAuthId, sup.id, {
name: `Supplier Express ${i} GmbH`,
});
ctx.suppliers.push(sup);
}
await store.supplier.list(ctx.googleAuthId);
// 15. Articles
const numArticles = counts.articles;
for (let i = 1; i <= numArticles; i++) {
const targetCat = ctx.categories[i % ctx.categories.length];
const isParent = i % 4 === 1;
const art = await store.article.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: targetCat.id,
name: `Bench Article ${i}`,
});
const sku = art.sku;
ctx.articles.push(art);
// Update article details
await store.article.updateBySku(ctx.googleAuthId, sku, {
name: `Bench Article ${i} Pro`,
unitSi: 'stk',
unitamount: 1,
});
// Prices
await store.article.setPricesBySku(ctx.googleAuthId, sku, [
{ price: 10 + i * 2.5, tax: 19, minmultiplier: 1 },
{ price: 8 + i * 2.5, tax: 19, minmultiplier: 5 },
]);
// EANs
const ean = `4012345${String(i).padStart(6, '0')}`;
await store.article.setEansBySku(ctx.googleAuthId, sku, [ean]);
// Brand
await store.article.setBrandIdBySku(ctx.googleAuthId, sku, ctx.brands[i % ctx.brands.length].id);
// Weight
await store.article.setWeightBySku(ctx.googleAuthId, sku, 0.25 * i);
// Categories
await store.article.setCategoryIdsBySku(ctx.googleAuthId, sku, [
targetCat.id,
ctx.categories[(i + 1) % ctx.categories.length].id,
]);
// V/K Parent-Child hierarchy
if (isParent) {
ctx.parentArticles.push(art);
} else if (ctx.parentArticles.length > 0) {
const parentParent = ctx.parentArticles[ctx.parentArticles.length - 1];
await store.article.setParentBySku(ctx.googleAuthId, sku, parentParent.sku);
ctx.childArticles.push(art);
}
// Add image on select articles
if (i <= 3) {
const imgRes = await store.article.addImage(ctx.googleAuthId, sku, sampleImage);
ctx.sampleImageHash = imgRes.fullHash;
ctx.sampleImageThumbHash = imgRes.thumbHash;
await store.article.orderImages(ctx.googleAuthId, sku, {
fullHashes: [imgRes.fullHash],
});
}
// Article Suppliers
if (ctx.suppliers.length > 0) {
const sup = ctx.suppliers[i % ctx.suppliers.length];
const artSup = await store.articlesupplier.create(ctx.googleAuthId, sku, {
entityId: sup.id,
sku: `SUP-SKU-${i}`,
pu: 1,
stock: 100,
sort: 1,
netPrice: 7.5 + i,
taxId: ctx.company.taxrateId,
});
await store.articlesupplier.update(ctx.googleAuthId, sku, artSup.id, {
stock: 120,
pu: 2,
});
await store.articlesupplier.order(ctx.googleAuthId, sku, {
ids: [artSup.id],
});
}
}
// 16. Article Import Rows API
const importRows = [
{
sku: `IMP-${Date.now()}-1`,
name: 'Imported Keyboard Model X',
vk: 'V',
parentCategory: 'Hardware / Components / Processors',
brand: 'BenchBrand Pro',
net: '45,50',
tax: 19,
eans: [`4262557${String(Date.now()).slice(-6)}`],
},
{
sku: `IMP-${Date.now()}-2`,
name: 'Imported Keyboard Variant Black',
vk: 'K',
parentCategory: 'Hardware / Components / Processors',
brand: 'BenchBrand Pro',
net: '45,50',
tax: 19,
parentSku: `IMP-${Date.now()}-1`,
},
];
await store.article.importRows({
googleAuthId: ctx.googleAuthId,
rows: importRows,
});
// 17. Manifests: Quotes, Orders, Deliveries
const numManifests = counts.manifests;
for (let i = 1; i <= numManifests; i++) {
const ent = ctx.entities[i % ctx.entities.length];
const sup = ctx.suppliers[i % ctx.suppliers.length];
const art = ctx.articles[i % ctx.articles.length];
// Quote
const quote = await store.quote.create(ctx.googleAuthId, {
number: `QUO-${Date.now()}-${i}`,
date: new Date().toISOString(),
entityId: ent.id,
externalNumber: `EXT-Q-${i}`,
lines: [
{
sku: art.sku,
name: `Item ${art.sku}`,
amount: 2,
net: 25.0,
pu: 1,
rebate: 0,
taxrate: 19,
comment: 'Standard quote item',
},
],
});
await store.quote.update(ctx.googleAuthId, quote.id, {
externalNumber: `EXT-Q-${i}-UPDATED`,
});
ctx.quotes.push(quote);
// Order
const order = await store.order.create(ctx.googleAuthId, {
number: `ORD-${Date.now()}-${i}`,
date: new Date().toISOString(),
entityId: ent.id,
externalNumber: `EXT-O-${i}`,
lines: [
{
sku: art.sku,
name: `Item ${art.sku}`,
amount: 5,
net: 25.0,
pu: 1,
rebate: 5,
taxrate: 19,
comment: 'Expedited delivery order',
},
],
});
await store.order.update(ctx.googleAuthId, order.id, {
externalNumber: `EXT-O-${i}-CONFIRMED`,
});
ctx.orders.push(order);
// Delivery with attached files
const delivery = await store.delivery.create(ctx.googleAuthId, {
supplierId: sup.id,
externalNumber: `DEL-${Date.now()}-${i}`,
date: new Date().toISOString(),
lines: [
{
sku: art.sku,
name: `Delivery Item ${art.sku}`,
amount: 50,
net: 15.0,
pu: 1,
rebate: 0,
taxrate: 19,
comment: 'Warehouse receipt',
},
],
files: i === 1 ? [
{
name: 'packing-slip.txt',
mimetype: 'text/plain',
content: Buffer.from(`Packing slip details for delivery ${i}`),
},
] : [],
});
await store.delivery.update(ctx.googleAuthId, delivery.id, {
externalNumber: `DEL-${Date.now()}-${i}-STOCKED`,
});
ctx.deliveries.push(delivery);
}
// 18. Manifest Attachments (file storage API)
if (ctx.deliveries.length > 0) {
const primaryManifest = ctx.deliveries[0];
const attach1 = await store.manifestattachment.add(ctx.googleAuthId, primaryManifest.id, {
name: 'invoice.pdf',
mimetype: 'application/pdf',
content: Buffer.from('%PDF-1.4 ... benchmark dummy pdf content ...'),
thumbavif: sampleThumb,
thumbw: 64,
thumbh: 64,
});
const attach2 = await store.manifestattachment.add(ctx.googleAuthId, primaryManifest.id, {
name: 'quality-report.txt',
mimetype: 'text/plain',
content: Buffer.from('Quality inspection passed successfully.'),
});
const currentList = await store.manifestattachment.listByManifestId(
ctx.googleAuthId,
primaryManifest.id,
);
await store.manifestattachment.order(ctx.googleAuthId, primaryManifest.id, {
ids: currentList.map((a) => a.id).reverse(),
});
ctx.attachments.push({ manifestId: primaryManifest.id, ...attach1 });
}
return ctx;
}
/**
* Executes Phase 2: Filled Database Performance Benchmark.
* Runs read, query, search, and lookup APIs against the populated database
* over multiple iterations to measure realistic data access speeds.
*/
export async function benchmarkFilledDatabase(store, ctx, options = {}) {
const iterations = options.iterations || 5;
for (let iter = 0; iter < iterations; iter++) {
// 1. Category Tree & Articles
await store.category.getTreeForCompany(ctx.googleAuthId);
if (ctx.categories.length > 0) {
await store.category.getCategoryArticles(ctx.googleAuthId, ctx.categories[0].id);
}
// 2. Article Catalog Read APIs
await store.article.listSearchIndex(ctx.googleAuthId);
await store.article.listExport(ctx.googleAuthId);
if (ctx.categories.length > 0) {
await store.article.listExport(ctx.googleAuthId, ctx.categories[0].id);
}
// Article SKU lookups & history
if (ctx.articles.length > 0) {
const sampleSku = ctx.articles[iter % ctx.articles.length].sku;
await store.article.getBySku(ctx.googleAuthId, sampleSku);
await store.article.getHistoryBySku(ctx.googleAuthId, sampleSku);
}
// 3. Article Supplier Lookups
if (ctx.articles.length > 0) {
const sampleSku = ctx.articles[iter % ctx.articles.length].sku;
await store.articlesupplier.listByArticleSku(ctx.googleAuthId, sampleSku);
if (ctx.suppliers.length > 0) {
await store.articlesupplier.listByEntityAndSkus(ctx.googleAuthId, {
supplierId: ctx.suppliers[0].id,
skus: [sampleSku],
});
await store.articlesupplier.listBySupplierAndSkus(ctx.googleAuthId, {
supplierId: ctx.suppliers[0].id,
skus: [sampleSku],
});
}
}
// 4. Pic & Thumbnail Reads
if (ctx.sampleImageHash) {
await store.pic.getImageByHash(ctx.googleAuthId, ctx.sampleImageHash);
await store.pic.getThumbByHash(ctx.googleAuthId, ctx.sampleImageHash);
}
// 5. Entities (Customers) Lookups
await store.entity.list(ctx.googleAuthId);
if (ctx.customergroups.length > 0) {
await store.entity.list(ctx.googleAuthId, { customergroupId: ctx.customergroups[0].id });
}
if (ctx.entities.length > 0) {
const sampleEnt = ctx.entities[iter % ctx.entities.length];
await store.entity.getById(ctx.googleAuthId, sampleEnt.id);
await store.entityaddress.list(ctx.googleAuthId, sampleEnt.id);
await store.entitycontact.list(ctx.googleAuthId, sampleEnt.id);
}
// 6. Suppliers Lookups
await store.supplier.list(ctx.googleAuthId);
// 7. Manifests Lookups (Delivery, Order, Quote)
await store.delivery.list(ctx.googleAuthId);
if (ctx.deliveries.length > 0) {
const sampleDel = ctx.deliveries[iter % ctx.deliveries.length];
await store.delivery.getById(ctx.googleAuthId, sampleDel.id);
}
await store.order.list(ctx.googleAuthId);
if (ctx.orders.length > 0) {
const sampleOrd = ctx.orders[iter % ctx.orders.length];
await store.order.getById(ctx.googleAuthId, sampleOrd.id);
}
await store.quote.list(ctx.googleAuthId);
if (ctx.quotes.length > 0) {
const sampleQuo = ctx.quotes[iter % ctx.quotes.length];
await store.quote.getById(ctx.googleAuthId, sampleQuo.id);
}
// 8. Manifest Attachments
if (ctx.attachments.length > 0) {
const sampleAttach = ctx.attachments[0];
await store.manifestattachment.listByManifestId(ctx.googleAuthId, sampleAttach.manifestId);
await store.manifestattachment.getById(ctx.googleAuthId, sampleAttach.manifestId, sampleAttach.id);
}
// 9. Auth & Admin Queries
await store.google_auth.getById(ctx.googleAuthId);
await store.google_auth.getByEmail(`benchmark.admin.${ctx.googleAuthId}`); // may return undefined or auth object
await store.companysetting.list(ctx.googleAuthId);
await store.posterminal.list(ctx.googleAuthId);
}
}
/**
* Executes Phase 3: Lifecycle & Deletion APIs.
* Uses dedicated throwaway test items to exercise all delete and removal APIs
* without destroying the core benchmarked dataset.
*/
export async function testLifecycleDeletions(store, ctx) {
const sampleImage = await makeSampleImage(80, 80, { r: 180, g: 80, b: 80 });
// 1. Temporary Category with Image & Delete
const tempCat = await store.category.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: ctx.company.rootCategoryId,
name: 'Temporary Cat for Delete',
});
await store.category.addImage(ctx.googleAuthId, tempCat.id, sampleImage);
await store.category.deleteImage(ctx.googleAuthId, tempCat.id);
await store.category.delete({ googleAuthId: ctx.googleAuthId, id: tempCat.id });
// 2. Temporary Article with Image & Delete
const tempArt = await store.article.createUnderParent({
googleAuthId: ctx.googleAuthId,
parentId: ctx.categories[0].id,
name: 'Temporary Article for Delete',
});
const artImg = await store.article.addImage(ctx.googleAuthId, tempArt.sku, sampleImage);
await store.article.deleteImage(ctx.googleAuthId, tempArt.sku, artImg.fullHash);
// Article Supplier Delete
if (ctx.suppliers.length > 0) {
const tempArtSup = await store.articlesupplier.create(ctx.googleAuthId, tempArt.sku, {
entityId: ctx.suppliers[0].id,
sku: 'TEMP-SUP-SKU',
});
await store.articlesupplier.delete(ctx.googleAuthId, tempArt.sku, tempArtSup.id);
}
await store.article.delete(ctx.googleAuthId, tempArt.sku);
// 3. Manifest Attachment Remove
if (ctx.deliveries.length > 0) {
const tempAttach = await store.manifestattachment.add(ctx.googleAuthId, ctx.deliveries[0].id, {
name: 'delete-me.txt',
mimetype: 'text/plain',
content: Buffer.from('temp file to remove'),
});
await store.manifestattachment.remove(ctx.googleAuthId, ctx.deliveries[0].id, tempAttach.id);
}
// 4. Temporary Delivery, Order, Quote Delete
if (ctx.suppliers.length > 0) {
const tempDel = await store.delivery.create(ctx.googleAuthId, {
supplierId: ctx.suppliers[0].id,
date: new Date().toISOString(),
lines: [{ name: 'Temp item', amount: 1, net: 10, taxrate: 19 }],
});
await store.delivery.delete(ctx.googleAuthId, tempDel.id);
}
const tempOrd = await store.order.create(ctx.googleAuthId, {
number: `TEMP-ORD-${Date.now()}`,
date: new Date().toISOString(),
lines: [{ name: 'Temp item', amount: 1, net: 10, taxrate: 19 }],
});
await store.order.delete(ctx.googleAuthId, tempOrd.id);
const tempQuo = await store.quote.create(ctx.googleAuthId, {
number: `TEMP-QUO-${Date.now()}`,
date: new Date().toISOString(),
lines: [{ name: 'Temp item', amount: 1, net: 10, taxrate: 19 }],
});
await store.quote.delete(ctx.googleAuthId, tempQuo.id);
// 5. Temporary Entity with Contact & Address Delete
const tempEnt = await store.entity.create(ctx.googleAuthId, {
customergroupId: ctx.customergroups[0].id,
name: 'Temporary Delete Entity',
});
const tempAddr = await store.entityaddress.create(ctx.googleAuthId, tempEnt.id, {
addressType: 'billing',
street: 'Temp St',
});
await store.entityaddress.delete(ctx.googleAuthId, tempEnt.id, tempAddr.id);
const tempContact = await store.entitycontact.create(ctx.googleAuthId, tempEnt.id, {
contactType: 'phone',
contact: '+4912345678',
});
await store.entitycontact.delete(ctx.googleAuthId, tempEnt.id, tempContact.id);
await store.entity.delete(ctx.googleAuthId, tempEnt.id);
// 6. Temporary Supplier Delete
const tempSup = await store.supplier.create(ctx.googleAuthId, { name: 'Temp Sup for Delete' });
await store.supplier.delete(ctx.googleAuthId, tempSup.id);
// 7. Temporary Customergroup Delete
const tempCg = await store.customergroup.create(ctx.googleAuthId, { name: 'Temp CG Delete' });
await store.customergroup.delete(ctx.googleAuthId, tempCg.id);
// 8. Temporary Brand Delete
const tempBrand = await store.brand.upsert(ctx.googleAuthId, { name: `TempBrand-${Date.now()}` });
await store.brand.delete(ctx.googleAuthId, tempBrand.id);
// 9. Temporary Unit Delete
const tempUnitSi = `tunit-${Date.now()}`.slice(0, 15);
await store.unit.upsert(ctx.googleAuthId, {
si: tempUnitSi,
basesi: tempUnitSi,
basesifactor: 1,
symbol: 'tu',
name: 'Temp Unit',
});
await store.unit.delete(ctx.googleAuthId, tempUnitSi);
// 10. Temporary Terminal Delete
const tempTerm = await store.posterminal.upsert(ctx.googleAuthId, {
name: 'Temp Terminal Delete',
pairingpin: '9999',
});
await store.posterminal.delete(ctx.googleAuthId, tempTerm.id);
// 11. Company User Delete
if (ctx.compUserId) {
await store.companyuser.delete(ctx.compUserId);
}
// 12. Allowed Email Remove
const tempEmail = `bench.remove.${Date.now()}@example.com`;
await store.google_auth.add(tempEmail);
await store.google_auth.removeAllowedEmail(tempEmail);
// 13. Lang Delete
const tempLangId = await store.lang.create('nl');
await store.lang.delete(tempLangId);
// 14. Secondary Company Delete
if (ctx.secondaryCompany) {
await store.company.delete(ctx.secondaryCompany.id);
}
}