| export function formatDate(value?: string | null) { |
| if (!value) return "Sem data"; |
| return new Intl.DateTimeFormat("pt-BR", { |
| day: "2-digit", |
| month: "2-digit", |
| year: "numeric", |
| }).format(new Date(`${value}T12:00:00`)); |
| } |
|
|
| export function formatMonth(value?: string | null) { |
| if (!value) return "Sem mês"; |
| return new Intl.DateTimeFormat("pt-BR", { |
| month: "2-digit", |
| year: "numeric", |
| }).format(new Date(`${value}T12:00:00`)); |
| } |
|
|
| export function dateValueToMonthInput(value?: string | null) { |
| if (!value) return ""; |
| return value.slice(0, 7); |
| } |
|
|
| export function monthInputToDateValue(value?: string | null) { |
| if (!value) return null; |
| return `${value}-01`; |
| } |
|
|
| export function formatDateTime(value?: string | null) { |
| if (!value) return "Sem data"; |
| return new Intl.DateTimeFormat("pt-BR", { |
| day: "2-digit", |
| month: "2-digit", |
| year: "numeric", |
| hour: "2-digit", |
| minute: "2-digit", |
| }).format(new Date(value)); |
| } |
|
|
| export function formatNumber(value: number) { |
| return new Intl.NumberFormat("pt-BR", { |
| minimumFractionDigits: value % 1 === 0 ? 0 : 1, |
| maximumFractionDigits: 2, |
| }).format(value); |
| } |
|
|
| export function statusLabel(status: string) { |
| const normalized = status.replace(/_/g, " ").trim().toLowerCase(); |
| const labels: Record<string, string> = { |
| sem_atribuicao: "Sem atribuição", |
| "sem atribuicao": "Sem atribuição", |
| com_avaliador: "Com avaliador", |
| "com avaliador": "Com avaliador", |
| pendente_revisao: "Pendente de revisão", |
| "pendente revisao": "Pendente de revisão", |
| em_ajuste: "Em ajuste", |
| "em ajuste": "Em ajuste", |
| revisado: "Revisado", |
| pronto: "Pronto", |
| enviado: "Enviado", |
| pendente: "Pendente", |
| ativa: "Ativa", |
| planejada: "Planejada", |
| concluido: "Concluído", |
| concluida: "Concluída", |
| "sem dado": "Sem dado", |
| }; |
|
|
| return labels[normalized] ?? normalized.charAt(0).toUpperCase() + normalized.slice(1); |
| } |
|
|
| export function hasPriority(value?: string | null) { |
| const normalized = (value ?? "").trim().toLowerCase(); |
| return Boolean(normalized) && !normalized.startsWith("sem prioridade"); |
| } |
|
|
| export function goalDifferenceText(planned: number, capacity: number) { |
| const difference = capacity - planned; |
| if (difference === 0) return "Carga igual à capacidade"; |
| if (difference > 0) return `${formatNumber(difference)} dia(s) livres no período`; |
| return `${formatNumber(Math.abs(difference))} dia(s) acima da capacidade`; |
| } |
|
|
| export function goalReadingText(planned: number, capacity: number, rawStatus?: string | null) { |
| const normalized = (rawStatus ?? "").toLowerCase(); |
| if (normalized.includes("treinamento")) return "Período de treinamento"; |
| if (!capacity) return "Sem capacidade registrada"; |
| if (planned > capacity) return "Planejamento acima da capacidade"; |
| if (planned < capacity) return "Planejamento abaixo da capacidade"; |
| return "Planejamento igual à capacidade"; |
| } |
|
|