Files
company-tool/scripts/dev-seed.mjs
Torsten Schulz (local) 0e539710c0 feat: Add password reset functionality with request and reset forms
feat: Implement price list import feature with preview and apply options

feat: Create price rules management page with CRUD operations

feat: Develop quotes management page with itemized quotes and status tracking

feat: Introduce organization registration page for new users

feat: Build suppliers management page with detailed supplier information

feat: Create users management page for inviting and managing roles

chore: Add TypeScript configuration for improved type checking

chore: Set up Vite configuration for development server and API proxy

chore: Add Vite environment type definitions for better TypeScript support
2026-06-02 15:28:38 +02:00

131 lines
3.5 KiB
JavaScript

#!/usr/bin/env node
const baseUrl = process.argv[2] ?? process.env.API_BASE_URL ?? "http://127.0.0.1:8080";
const stamp = Date.now();
const email = process.env.DEV_SEED_EMAIL ?? `seed-admin-${stamp}@example.test`;
async function request(method, path, body, token) {
const response = await fetch(`${baseUrl}${path}`, {
method,
headers: {
"Content-Type": "application/json",
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: body === undefined ? undefined : JSON.stringify(body),
});
const text = await response.text();
const data = text ? JSON.parse(text) : {};
if (!response.ok) {
throw new Error(`${method} ${path} failed: ${response.status} ${JSON.stringify(data)}`);
}
return data;
}
function assert(condition, message) {
if (!condition) throw new Error(message);
}
async function main() {
console.log(`creating development seed data via ${baseUrl}`);
const bootstrap = await request("POST", "/api/v1/dev/bootstrap-local", {
organization_name: `Seed Firma ${stamp}`,
email,
});
assert(bootstrap.password, "dev bootstrap password missing");
const login = await request("POST", "/api/v1/auth/login", {
email,
password: bootstrap.password,
});
const token = login.access_token;
assert(token, "login token missing");
await request("POST", "/api/v1/auth/select-organization", {
organization_id: login.organization_id,
}, token);
const cashDiscountTerm = await request("POST", "/api/v1/cash-discount-terms", {
code: `SEED-${stamp}`,
name: "2 % Skonto, 30 Tage netto",
discount_percent: "2.00",
discount_days: 10,
net_days: 30,
valid_from: null,
valid_until: null,
is_default_customer_term: true,
is_default_supplier_term: true,
is_active: true,
}, token);
const customer = await request("POST", "/api/v1/customers", {
customer_number: "",
name: "Seed Kunde GmbH",
status: "active",
details: {
street: "Kundenweg 10",
postal_code: "60311",
city: "Frankfurt",
country: "Deutschland",
email: "kunde@example.test",
phone: "",
},
standard_discount_percent: "5.00",
cash_discount_term_id: cashDiscountTerm.id,
}, token);
const supplier = await request("POST", "/api/v1/suppliers", {
supplier_number: "",
name: "Seed Lieferant GmbH",
status: "active",
details: {
street: "Lieferstraße 8",
postal_code: "10115",
city: "Berlin",
country: "Deutschland",
email: "lieferant@example.test",
phone: "",
},
standard_discount_percent: "0.00",
cash_discount_term_id: cashDiscountTerm.id,
payment_days: 30,
}, token);
const item = await request("POST", "/api/v1/items", {
item_number: "",
name: "Seed Montagestunde",
unit: "Std",
tax_rate: "19.00",
default_purchase_price: "40.00",
default_sales_price: "85.00",
status: "active",
}, token);
const activity = await request("POST", "/api/v1/activities", {
activity_number: null,
activity_type: "task",
title: "Seed Aktivität",
body: "Testdaten für lokale Entwicklung.",
status: "open",
priority: "normal",
due_at: null,
}, token);
console.log(JSON.stringify({
email,
password: bootstrap.password,
organization_id: login.organization_id,
customer_number: customer.customer_number,
supplier_number: supplier.supplier_number,
item_number: item.item_number,
activity_number: activity.activity_number,
}, null, 2));
}
main().catch((error) => {
console.error(error);
process.exit(1);
});