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
131 lines
3.5 KiB
JavaScript
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);
|
|
});
|