Files
graphs/src/types.ts
Cauê Faleiros a26bc8813e
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 59s
Add client purchase pattern analytics
2026-07-01 10:25:07 -03:00

313 lines
5.9 KiB
TypeScript

export interface OrderData {
Nome_Cliente: string;
Data_Pedido: string;
Valor_Pedido: number;
ID_Produto: string;
Descricao_Produto: string;
Quantidade: number;
Valor_Unitario: number;
Recebido_Em?: string;
ID_Pedido?: string;
Fone_Cliente?: string;
cliente_nome_fantasia?: string;
id_vendedor?: string;
nome_vendedor?: string;
marketplace?: string;
canal_venda?: string;
numero_ecommerce?: string;
}
export interface StockData {
produto_id: string;
nome: string;
saldo: number;
delta_estoque: number;
updated_at?: string;
}
export interface DateRange {
start: Date;
end: Date;
}
export type AuthRole = 'super_admin' | 'user';
export interface AuthUser {
id: number | null;
name: string;
email: string;
role: AuthRole;
}
export interface ManagedUser {
id: number;
name: string;
email: string;
isActive: boolean;
createdAt: string;
updatedAt: string;
}
export interface CreateUserResult {
user: ManagedUser;
temporaryPassword?: string;
}
export interface DashboardAnalytics {
totalRevenue: number;
totalOrders: number;
orderLineCount?: number;
averageOrderValue: number;
salesByProduct: Array<{
name: string;
id: string;
value: number;
}>;
revenueByProduct: Array<{
name: string;
id: string;
value: number;
}>;
revenueBySeller?: Array<{
name: string;
id: string;
value: number;
}>;
ordersBySeller?: Array<{
name: string;
id: string;
value: number;
}>;
sellerRevenueByDate?: Array<{
name: string;
id: string;
date: string;
value: number;
orders?: number;
}>;
sellerRevenueByHour?: Array<{
name: string;
id: string;
hour: number;
value: number;
orders?: number;
}>;
}
export interface ProductAnalyticsItem {
id: string;
name: string;
quantitySold: number;
revenue: number;
orderLineCount: number;
lastPrice: number;
stock: number;
firstSaleDate: string | null;
lastSaleDate: string | null;
}
export interface ProductDetailsAnalytics {
range: {
start: string | null;
end: string | null;
};
productInfo: {
id: string;
name: string;
price: number;
};
chartData: Array<{
date: string;
value: number;
}>;
totalSold: number;
totalRevenue: number;
}
export interface ClientAnalyticsItem {
customerKey: string;
clientToken: string;
name: string;
phone: string;
quantityPurchased: number;
totalSpent: number;
orderCount: number;
lastPurchaseDate: string;
}
export interface ClientMetadataFilters {
marketplace: string;
canal_venda: string;
seller: string;
}
export interface ClientSellerFilterOption {
value: string;
id: string;
name: string;
}
export interface ClientFilterOptions {
marketplaces: string[];
salesChannels: string[];
sellers: ClientSellerFilterOption[];
}
export interface ClientPurchasePatternAnalytics {
purchaseWeekdays: Array<{
label: string;
value: number;
}>;
purchaseHours: Array<{
label: string;
value: number;
}>;
}
export interface RfmClient {
customerKey: string;
clientToken: string;
name: string;
phone: string;
monetary: number;
frequency: number;
quantityPurchased: number;
lastPurchaseDate: string;
recencyDays: number;
recencyScore: 1 | 2 | 3;
frequencyScore: 1 | 2 | 3;
monetaryScore: 1 | 2 | 3;
valueScore: 1 | 2 | 3;
rfmScore: string;
segmentKey: string;
segmentLabel: string;
}
export interface RfmSegment {
key: string;
label: string;
count: number;
totalRevenue: number;
averageRevenue: number;
}
export interface RfmAnalytics {
range: {
start: string | null;
end: string | null;
};
clients: RfmClient[];
segments: RfmSegment[];
matrix: {
recencyScores: number[];
valueScores: number[];
};
}
export interface GroupedClientOrder {
date: string;
orderId: string;
orderTotal: number;
items: OrderData[];
}
export interface ClientDetailsAnalytics {
range: {
start: string | null;
end: string | null;
};
clientToken: string;
chartData: Array<{
date: string;
value: number;
}>;
purchaseWeekdays?: Array<{
label: string;
value: number;
}>;
purchaseHours?: Array<{
label: string;
value: number;
}>;
groupedOrders: GroupedClientOrder[];
allTimeOrderCount: number;
clientName: string;
clientPhone: string;
hasClient: boolean;
periodAverageTicket: number;
periodOrderCount: number;
periodSpent: number;
periodItems: number;
}
export type CampaignStatus = 'pending' | 'processing' | 'sent' | 'failed' | 'skipped';
export interface CampaignQueueItem {
id: number;
base_product_name: string;
produto_id: string;
nome: string;
saldo: number;
delta_estoque: number;
status: CampaignStatus;
attempts: number;
last_error?: string | null;
created_at: string;
updated_at: string;
sent_at?: string | null;
}
export interface CampaignGroup {
key: string;
baseProductName: string;
status: CampaignStatus;
totalDelta: number;
rowCount: number;
attempts: number;
lastError?: string | null;
createdAt: string;
updatedAt: string;
sentAt?: string | null;
items: CampaignQueueItem[];
}
export interface CampaignQueueSummary {
threshold: number;
maxAttempts: number;
groups: CampaignGroup[];
rows: CampaignQueueItem[];
}
export interface CampaignProductPreview {
baseProduct: string;
total_delta: number;
sizes: Array<{
id: string;
nome: string;
delta: number;
saldo: number;
}>;
}
export interface CampaignPreview {
threshold: number;
readyProducts: CampaignProductPreview[];
belowThresholdProducts: CampaignProductPreview[];
productsText: string;
customerCount: number;
customersPreview: Array<{
nome: string;
fone: string;
total_gasto?: string;
total_comprado?: string;
}>;
}
export interface CampaignProcessSummary {
claimed: number;
sentGroups: number;
skippedGroups: number;
failedGroups: number;
pendingBelowThresholdGroups: number;
}