miinventario-mobile-v2/src/services/api/reports.service.ts
rckrdmrd eb718a95aa Sincronización desde miinventario/apps/mobile - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:29:24 -06:00

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;
},
};