mirror of
https://github.com/felipegcoutinho/openmonetis.git
synced 2026-05-09 19:01:47 +00:00
refactor(core): move app para src e padroniza estrutura
This commit is contained in:
105
src/features/reports/utils.ts
Normal file
105
src/features/reports/utils.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import type { DateRangeValidation } from "@/shared/lib/types/reports";
|
||||
import { calculatePercentageChange } from "@/shared/utils/math";
|
||||
import { formatPercentageChange as formatPercentageChangeValue } from "@/shared/utils/percentage";
|
||||
import {
|
||||
buildPeriodRange,
|
||||
formatShortPeriodLabel,
|
||||
parsePeriod,
|
||||
} from "@/shared/utils/period";
|
||||
|
||||
// Re-export for convenience
|
||||
export { calculatePercentageChange };
|
||||
|
||||
/**
|
||||
* Formats period string from "YYYY-MM" to "MMM/YYYY" format
|
||||
* Example: "2025-01" -> "Jan/2025"
|
||||
*
|
||||
* @param period - Period in YYYY-MM format
|
||||
* @returns Formatted period string
|
||||
*/
|
||||
export function formatPeriodLabel(period: string): string {
|
||||
try {
|
||||
parsePeriod(period);
|
||||
return formatShortPeriodLabel(period);
|
||||
} catch {
|
||||
return period; // Return original if parsing fails
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates an array of periods between start and end (inclusive)
|
||||
* Alias for buildPeriodRange from period utils
|
||||
*
|
||||
* @param startPeriod - Start period in YYYY-MM format
|
||||
* @param endPeriod - End period in YYYY-MM format
|
||||
* @returns Array of period strings in chronological order
|
||||
*/
|
||||
export function generatePeriodRange(
|
||||
startPeriod: string,
|
||||
endPeriod: string,
|
||||
): string[] {
|
||||
return buildPeriodRange(startPeriod, endPeriod);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that end date is >= start date and period is within limits
|
||||
* Maximum allowed period: 24 months
|
||||
*
|
||||
* @param startPeriod - Start period in YYYY-MM format
|
||||
* @param endPeriod - End period in YYYY-MM format
|
||||
* @returns Validation result with error message if invalid
|
||||
*/
|
||||
export function validateDateRange(
|
||||
startPeriod: string,
|
||||
endPeriod: string,
|
||||
): DateRangeValidation {
|
||||
try {
|
||||
// Parse periods to validate format
|
||||
const start = parsePeriod(startPeriod);
|
||||
const end = parsePeriod(endPeriod);
|
||||
|
||||
// Check if end is before start
|
||||
if (
|
||||
end.year < start.year ||
|
||||
(end.year === start.year && end.month < start.month)
|
||||
) {
|
||||
return {
|
||||
isValid: false,
|
||||
error: "A data final deve ser maior ou igual à data inicial",
|
||||
};
|
||||
}
|
||||
|
||||
// Calculate number of months between periods
|
||||
const monthsDiff =
|
||||
(end.year - start.year) * 12 + (end.month - start.month) + 1;
|
||||
|
||||
// Check if period exceeds 24 months
|
||||
if (monthsDiff > 24) {
|
||||
return {
|
||||
isValid: false,
|
||||
error: "O período máximo permitido é de 24 meses",
|
||||
};
|
||||
}
|
||||
|
||||
return { isValid: true };
|
||||
} catch (error) {
|
||||
return {
|
||||
isValid: false,
|
||||
error:
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Formato de período inválido. Use YYYY-MM",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats percentage change for display
|
||||
* Format: "±X%" or "±X.X%" (one decimal if < 10%)
|
||||
*
|
||||
* @param change - Percentage change value
|
||||
* @returns Formatted percentage string
|
||||
*/
|
||||
export function formatPercentageChange(change: number | null): string {
|
||||
return formatPercentageChangeValue(change);
|
||||
}
|
||||
Reference in New Issue
Block a user