172 lines
3.5 KiB
TypeScript
172 lines
3.5 KiB
TypeScript
import apiClient from './client';
|
|
|
|
// Report Types
|
|
export interface ValuationSummary {
|
|
totalItems: number;
|
|
totalCost: number;
|
|
totalPrice: number;
|
|
potentialMargin: number;
|
|
potentialMarginPercent: number;
|
|
}
|
|
|
|
export interface ValuationByCategory {
|
|
category: string;
|
|
itemCount: number;
|
|
totalCost: number;
|
|
totalPrice: number;
|
|
margin: number;
|
|
}
|
|
|
|
export interface ValuationItem {
|
|
id: string;
|
|
name: string;
|
|
category: string;
|
|
quantity: number;
|
|
cost: number;
|
|
price: number;
|
|
totalCost: number;
|
|
totalPrice: number;
|
|
margin: number;
|
|
}
|
|
|
|
export interface ValuationReport {
|
|
summary: ValuationSummary;
|
|
byCategory: ValuationByCategory[];
|
|
items: ValuationItem[];
|
|
}
|
|
|
|
export interface MovementsSummary {
|
|
period: { start: string; end: string };
|
|
totalMovements: number;
|
|
netChange: number;
|
|
itemsIncreased: number;
|
|
itemsDecreased: number;
|
|
}
|
|
|
|
export interface MovementRecord {
|
|
id: string;
|
|
date: string;
|
|
itemId: string;
|
|
itemName: string;
|
|
type: string;
|
|
change: number;
|
|
quantityBefore: number;
|
|
quantityAfter: number;
|
|
reason?: string;
|
|
}
|
|
|
|
export interface MovementsByItem {
|
|
itemId: string;
|
|
itemName: string;
|
|
netChange: number;
|
|
movementCount: number;
|
|
}
|
|
|
|
export interface MovementsReport {
|
|
summary: MovementsSummary;
|
|
movements: MovementRecord[];
|
|
byItem: MovementsByItem[];
|
|
total: number;
|
|
page: number;
|
|
limit: number;
|
|
hasMore: boolean;
|
|
}
|
|
|
|
export interface CategorySummary {
|
|
totalCategories: number;
|
|
totalItems: number;
|
|
totalValue: number;
|
|
}
|
|
|
|
export interface CategoryDetail {
|
|
name: string;
|
|
itemCount: number;
|
|
percentOfTotal: number;
|
|
totalValue: number;
|
|
lowStockCount: number;
|
|
averagePrice: number;
|
|
topItems: { name: string; quantity: number }[];
|
|
}
|
|
|
|
export interface CategoriesReport {
|
|
summary: CategorySummary;
|
|
categories: CategoryDetail[];
|
|
}
|
|
|
|
export interface LowStockSummary {
|
|
totalAlerts: number;
|
|
criticalCount: number;
|
|
warningCount: number;
|
|
totalValueAtRisk: number;
|
|
}
|
|
|
|
export interface LowStockItem {
|
|
id: string;
|
|
name: string;
|
|
category: string;
|
|
quantity: number;
|
|
minStock: number;
|
|
shortage: number;
|
|
estimatedReorderCost: number;
|
|
lastMovementDate?: string;
|
|
priority: 'critical' | 'warning' | 'watch';
|
|
}
|
|
|
|
export interface LowStockReport {
|
|
summary: LowStockSummary;
|
|
items: LowStockItem[];
|
|
}
|
|
|
|
export interface MovementsQueryParams {
|
|
startDate?: string;
|
|
endDate?: string;
|
|
page?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
export const reportsService = {
|
|
/**
|
|
* Get valuation report
|
|
*/
|
|
getValuationReport: async (storeId: string): Promise<ValuationReport> => {
|
|
const response = await apiClient.get<ValuationReport>(
|
|
`/stores/${storeId}/reports/valuation`,
|
|
);
|
|
return response.data;
|
|
},
|
|
|
|
/**
|
|
* Get movements report
|
|
*/
|
|
getMovementsReport: async (
|
|
storeId: string,
|
|
params?: MovementsQueryParams,
|
|
): Promise<MovementsReport> => {
|
|
const response = await apiClient.get<MovementsReport>(
|
|
`/stores/${storeId}/reports/movements`,
|
|
{ params },
|
|
);
|
|
return response.data;
|
|
},
|
|
|
|
/**
|
|
* Get categories report
|
|
*/
|
|
getCategoriesReport: async (storeId: string): Promise<CategoriesReport> => {
|
|
const response = await apiClient.get<CategoriesReport>(
|
|
`/stores/${storeId}/reports/categories`,
|
|
);
|
|
return response.data;
|
|
},
|
|
|
|
/**
|
|
* Get low stock report
|
|
*/
|
|
getLowStockReport: async (storeId: string): Promise<LowStockReport> => {
|
|
const response = await apiClient.get<LowStockReport>(
|
|
`/stores/${storeId}/reports/low-stock`,
|
|
);
|
|
return response.data;
|
|
},
|
|
};
|