umami/scripts/seed/generators/revenue.ts
conorbranagan 80987f8548
Merge upstream umami v3.0.3 into master
Sync fork with latest upstream changes from umami-software/umami.
Resolves conflicts while preserving niteshift customizations:
- Dials SDK integration for runtime design prototyping
- Typography context for website metrics
- Overview Alt page with Sparkles icon
- Login redirect to /websites
- React Query cache seeding on login
- Node.js 20 LTS recommendation in README
2025-12-19 15:30:39 -05:00

65 lines
1.4 KiB
TypeScript

import { randomFloat, uuid } from '../utils.js';
import type { EventData } from './events.js';
export interface RevenueConfig {
eventName: string;
minAmount: number;
maxAmount: number;
currency: string;
weight: number;
}
export interface RevenueData {
id: string;
websiteId: string;
sessionId: string;
eventId: string;
eventName: string;
currency: string;
revenue: number;
createdAt: Date;
}
export function generateRevenue(event: EventData, config: RevenueConfig): RevenueData | null {
if (event.eventName !== config.eventName) {
return null;
}
if (Math.random() > config.weight) {
return null;
}
const revenue = randomFloat(config.minAmount, config.maxAmount);
return {
id: uuid(),
websiteId: event.websiteId,
sessionId: event.sessionId,
eventId: event.id,
eventName: event.eventName!,
currency: config.currency,
revenue: Math.round(revenue * 100) / 100, // Round to 2 decimal places
createdAt: event.createdAt,
};
}
export function generateRevenueForEvents(
events: EventData[],
configs: RevenueConfig[],
): RevenueData[] {
const revenueEntries: RevenueData[] = [];
for (const event of events) {
if (!event.eventName) continue;
for (const config of configs) {
const revenue = generateRevenue(event, config);
if (revenue) {
revenueEntries.push(revenue);
break; // Only one revenue per event
}
}
}
return revenueEntries;
}